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


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.