Ostrzeżenie „Użyj nowego słowa kluczowego, jeśli ukrywanie było zamierzone”


101

Na dole ekranu wyświetla się ostrzeżenie:

Ostrzeżenie 1 „WindowsFormsApplication2.EventControlDataSet.Events” ukrywa dziedziczony element członkowski „System.ComponentModel.MarshalByValueComponent.Events”. Użyj nowego słowa kluczowego, jeśli ukrywanie było zamierzone. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Jeśli kliknę dwukrotnie, pojawi się:

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

Czy ktoś może mi powiedzieć, jak się tego pozbyć?

Odpowiedzi:


145

Twoja klasa ma klasę bazową, a ta klasa bazowa ma również właściwość (która nie jest wirtualna ani abstrakcyjna) o nazwie Events, która jest zastępowana przez Twoją klasę. Jeśli zamierzasz go zastąpić, umieść słowo kluczowe „new” po modyfikatorze public. NA PRZYKŁAD

public new EventsDataTable Events
{
  ..
}

Jeśli nie chcesz go zastępować, zmień nazwę swoich właściwości na inną.


23
Oto link dla każdego, kto chce wiedzieć, jaka jest różnica między nowym a zastąpieniem.
— starsplusplus

Słowo new kluczowe pozbyłoby się błędu kompilacji, ale może wprowadzić inne niezamierzone zachowanie. Myślę, że powinieneś dodać ostrzeżenie do swojej odpowiedzi. Byłoby to pomocne w zrozumieniu konsekwencji dodawania new.
— ahong

13

@wdavo jest poprawne. To samo dotyczy funkcji.

Jeśli nadpisujesz funkcję podstawową, taką jak Aktualizacja, w swojej podklasie potrzebujesz:

new void Update()
{
  //do stufff
}

Bez nowego na początku dekleracji funkcji otrzymasz flagę ostrzegawczą.


6

W poniższym kodzie Class Aimplementuje interfejs IShowi implementuje jego metodę ShowData. Class Bdziedziczy Class A. Aby skorzystać z ShowDatametody w Class B, musimy użyć słowa kluczowego neww ShowDatametodzie, aby ukryć Class Ametodę klasy bazowej i użyć overridesłowa kluczowego w celu rozszerzenia metody.

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
W overridetwoim przykładzie nie ma z twojego wyjaśnienia i overridenie jest potrzebne.
— Etienne Faucher

Myślę, że twój przykład jest na dobrej drodze, ale jest niepełny. Twoje wyjaśnienie jest również niejasne. Czy możesz zmienić swoją odpowiedź tak, aby przypominała bardziej dotnetfiddle.net/Iw0OzB ? Jeśli nie, prawdopodobnie opublikuję moje skrzypce jako kolejną odpowiedź
— ahong

0

Funkcja nadrzędna potrzebuje virtualsłowa kluczowego, a funkcja potomna potrzebuje overridesłowa kluczowego przed definicją funkcji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.