Aviso “Use a nova palavra-chave se tiver intenção de ocultar”

101

Tenho um aviso na parte inferior da tela:

Aviso 1 'WindowsFormsApplication2.EventControlDataSet.Events' oculta o membro herdado 'System.ComponentModel.MarshalByValueComponent.Events'. Use a nova palavra-chave se a intenção era ocultar. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Se eu clicar duas vezes nele, aparecerá:

public EventsDataTable Events {
    get {
        return this.tableEvents;
    }

Alguém pode me dizer como me livrar disso?

Tony b
fonte

Respostas:

144

Sua classe tem uma classe base, e essa classe base também tem uma propriedade (que não é virtual ou abstrata) chamada Eventos que está sendo substituída por sua classe. Se você pretende substituí-lo, coloque a palavra-chave "nova" após o modificador público. POR EXEMPLO

public new EventsDataTable Events
{
  ..
}

Se você não deseja substituí-lo, altere o nome de suas propriedades para outro nome.

wdavo
fonte
23
Aqui está um link para quem deseja saber qual é a diferença entre novo e substituir.
starsplusplus
A new palavra-chave eliminaria o erro de compilação, mas pode introduzir outro comportamento não intencional. Acho que você deve adicionar um aviso à sua resposta. Isso seria útil para compreender as consequências da adição new.
ahong
13

@wdavo está correto. O mesmo também é verdadeiro para funções.

Se você substituir uma função base, como Update, em sua subclasse, você precisa:

new void Update()
{
  //do stufff
}

Sem o novo no início da eliminação da função, você obterá o sinalizador de aviso.

Agressor
fonte
6

No código abaixo, Class Aimplementa a interface IShowe implementa seu método ShowData. Class Bherda Class A. Para usar o ShowDatamétodo em Class B, temos que usar a palavra-chave newno ShowDatamétodo para ocultar o Class Amétodo da classe base e usar a overridepalavra-chave para estender o método.

interface IShow
{
    protected void ShowData();
}

class A : IShow
{
    protected void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class B : A
{
    protected new void ShowData()
    {
        Console.WriteLine("This is Class B");
    }
}
Joee
fonte
3
Não há nenhum overrideem seu exemplo de sua explicação e overridenão é necessário.
Etienne Faucher
Acho que seu exemplo está no caminho certo, mas está incompleto. Além disso, sua explicação não é clara. Você poderia editar sua resposta para algo mais parecido com dotnetfiddle.net/Iw0OzB ? Se não, provavelmente postarei meu violino como outra resposta
ahong
0

A função pai precisa da virtualpalavra - chave e a função filha precisa da overridepalavra - chave na frente da definição da função.

James L.
fonte