Warnung "Verwenden Sie das neue Schlüsselwort, wenn das Ausblenden beabsichtigt war"

101

Ich habe eine Warnung am unteren Rand meines Bildschirms:

Warnung 1 'WindowsFormsApplication2.EventControlDataSet.Events' verbirgt das geerbte Mitglied 'System.ComponentModel.MarshalByValueComponent.Events'. Verwenden Sie das neue Schlüsselwort, wenn das Ausblenden beabsichtigt war. C: \ Benutzer \ myComputer \ Desktop \ Ereignissteuerung \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Wenn ich darauf doppelklicke, wird Folgendes angezeigt:

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

Kann mir jemand sagen, wie ich das loswerden kann?

Tony b
quelle

Antworten:

144

Ihre Klasse hat eine Basisklasse, und diese Basisklasse hat auch eine Eigenschaft (die nicht virtuell oder abstrakt ist) namens Ereignisse, die von Ihrer Klasse überschrieben wird. Wenn Sie es überschreiben möchten, setzen Sie das Schlüsselwort "new" nach dem öffentlichen Modifikator. Z.B

public new EventsDataTable Events
{
  ..
}

Wenn Sie es nicht überschreiben möchten, ändern Sie den Namen Ihrer Eigenschaften in etwas anderes.

wdavo
quelle
23
Hier ist ein Link für alle, die wissen möchten, was der Unterschied zwischen Neu und Überschreiben ist.
Starsplusplus
Das new Schlüsselwort würde den Kompilierungsfehler beseitigen, kann jedoch zu einem anderen unbeabsichtigten Verhalten führen. Ich denke, Sie sollten Ihrer Antwort eine Warnung hinzufügen. Dies wäre hilfreich, um die Konsequenzen des Hinzufügens zu verstehen new.
Ahong
13

@wdavo ist richtig. Gleiches gilt auch für Funktionen.

Wenn Sie eine Basisfunktion wie Update überschreiben, benötigen Sie in Ihrer Unterklasse Folgendes:

new void Update()
{
  //do stufff
}

Ohne das neue zu Beginn der Funktionsdeklaration erhalten Sie das Warnflag.

Aggressor
quelle
6

Im folgenden Code wird Class Adie Schnittstelle IShowund ihre Methode implementiert ShowData. Class Berbt Class A. Um die ShowDataMethode in zu verwenden Class B, müssen wir das Schlüsselwort newin der ShowDataMethode verwenden, um die Basisklassenmethode auszublenden Class A, und das overrideSchlüsselwort verwenden, um die Methode zu erweitern.

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
quelle
3
Es gibt kein overrideBeispiel aus Ihrer Erklärung und es overridewird nicht benötigt.
Etienne Faucher
Ich denke, Ihr Beispiel ist auf dem richtigen Weg, aber unvollständig. Auch Ihre Erklärung ist unklar. Könnten Sie Ihre Antwort so bearbeiten, dass sie eher dotnetfiddle.net/Iw0OzB ähnelt ? Wenn nicht, werde ich wahrscheinlich meine Geige als weitere Antwort posten
ahong
0

Die übergeordnete Funktion benötigt das virtualSchlüsselwort und die untergeordnete Funktion benötigt das overrideSchlüsselwort vor der Funktionsdefinition.

James L.
quelle