Advertencia "Use la nueva palabra clave si se pretendía ocultar"

101

Tengo una advertencia en la parte inferior de mi pantalla:

Advertencia 1 'WindowsFormsApplication2.EventControlDataSet.Events' oculta el miembro heredado 'System.ComponentModel.MarshalByValueComponent.Events'. Usa la nueva palabra clave si te intentabas esconder. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Si hago doble clic en él, aparece:

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

¿Alguien puede decirme cómo deshacerme de esto?

tony b
fuente

Respuestas:

144

Su clase tiene una clase base, y esta clase base también tiene una propiedad (que no es virtual ni abstracta) llamada Eventos que está siendo anulada por su clase. Si tiene la intención de anularlo, ponga la palabra clave "nueva" después del modificador público. P.EJ

public new EventsDataTable Events
{
  ..
}

Si no desea anularlo, cambie el nombre de sus propiedades por otro.

wdavo
fuente
23
Aquí hay un enlace para cualquiera que quiera saber cuál es la diferencia entre nuevo y anulado.
starsplusplus
La new palabra clave eliminaría el error de compilación, pero puede introducir otros comportamientos no deseados. Creo que debería agregar una advertencia a su respuesta. Eso sería útil para comprender las consecuencias de sumar new.
Ahong
13

@wdavo es correcto. Lo mismo ocurre con las funciones.

Si anula una función base, como Actualizar, entonces en su subclase necesita:

new void Update()
{
  //do stufff
}

Sin el nuevo al comienzo de la declinación de la función, obtendrá la bandera de advertencia.

Agresor
fuente
6

En el código siguiente, Class Aimplementa la interfaz IShowe implementa su método ShowData. Class Bhereda Class A. Para usar el ShowDatamétodo en Class B, tenemos que usar la palabra clave newen el ShowDatamétodo para ocultar el Class Amétodo de la clase base y usar la overridepalabra clave para extender el 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
fuente
3
No hay overrideen su ejemplo de su explicación y overrideno es necesario.
Etienne Faucher
Creo que su ejemplo va por buen camino, pero está incompleto. Además, su explicación no está clara. ¿Podría editar su respuesta para que sea algo más como dotnetfiddle.net/Iw0OzB ? Si no, probablemente publique mi violín como otra respuesta
un
0

La función principal necesita la virtualpalabra clave y la función secundaria necesita la overridepalabra clave delante de la definición de la función.

James L.
fuente