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?

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.


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.


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");
    }
}

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.