Попередження "Використовуйте нове ключове слово, якщо приховування призначене"


101

Я маю попередження внизу екрана:

Попередження 1 "WindowsFormsApplication2.EventControlDataSet.Events" приховує спадковий член "System.ComponentModel.MarshalByValueComponent.Events". Використовуйте нове ключове слово, якщо приховування було призначено. C: \ Користувачі \ мійкомп'ютер \ Настільний \ Управління подіями \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Якщо я двічі клацну по ньому, то з'явиться:

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

Хтось може сказати мені, як від цього позбутися?

Відповіді:


144

У вашого класу є базовий клас, і цей базовий клас також має властивість (яка не є віртуальною чи абстрактною) під назвою "Події", яку перекриває ваш клас. Якщо ви маєте намір змінити його, поставте ключове слово "нове" після публічного модифікатора. EG

public new EventsDataTable Events
{
  ..
}

Якщо ви не бажаєте переосмислювати це, змініть ім’я своїх властивостей на щось інше.


23
Ось посилання для всіх, хто хоче знати, яка різниця між новою та переосмислювальною.
starsplusplus

new Ключове слово буде позбутися від помилки компіляції, але може ввести інші ненавмисні поведінку. Я думаю, ви повинні додати попередження до своєї відповіді. Це було б корисно для розуміння наслідків додавання new.
ahong

13

@wdavo правильний. Те саме стосується функцій.

Якщо ви замінюєте базову функцію, як-от Оновити, то в своєму підкласі вам потрібно:

new void Update()
{
  //do stufff
}

Без нового на початку декларації функції ви отримаєте попереджувальний прапор.


6

У наведеному нижче коді Class Aреалізується інтерфейс IShowта реалізується його метод ShowData. Class Bуспадковує Class A. Для використання ShowDataметоду в Class B, нам потрібно використовувати ключове слово newв ShowDataметоді, щоб приховати Class Aметод базового класу і використовувати overrideключове слово для розширення методу.

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
У overrideвашому прикладі немає жодного пояснення і overrideне потрібне.
Етьєн Фошер

Я думаю, що ваш приклад на вірному шляху, але є неповним. Також ваше пояснення незрозуміле. Чи можете ви відредагувати свою відповідь чимось більше, як dotnetfiddle.net/Iw0OzB ? Якщо ні, я, мабуть, опублікую свою
загадку

0

Батьківська функція потребує virtualключового слова, а дочірній функції потрібне overrideключове слово перед визначенням функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.