Предупреждение: «Используйте новое ключевое слово, если предполагалось скрытие»


101

У меня есть предупреждение внизу экрана:

Предупреждение 1 «WindowsFormsApplication2.EventControlDataSet.Events» скрывает унаследованный член «System.ComponentModel.MarshalByValueComponent.Events». Используйте новое ключевое слово, если предполагалось скрытие. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Если я дважды щелкну по нему, появится:

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

Может кто подскажет как от этого избавиться?

Ответы:


145

У вашего класса есть базовый класс, и этот базовый класс также имеет свойство (которое не является виртуальным или абстрактным), называемое событиями, которое переопределяется вашим классом. Если вы намереваетесь переопределить его, поместите ключевое слово «новое» после модификатора public. НАПРИМЕР

public new EventsDataTable Events
{
  ..
}

Если вы не хотите переопределять его, измените имя ваших свойств на другое.


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

new Ключевое слово будет избавиться от ошибки компиляции, но может ввести другие непреднамеренные поведение. Я думаю, тебе стоит добавить к своему ответу предупреждение. Это было бы полезно для понимания последствий добавления new.
ахонг

13

@wdavo правильно. То же верно и для функций.

Если вы переопределите базовую функцию, например Update, то в вашем подклассе вам понадобятся:

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не требуется.
Etienne Faucher

Я думаю, что ваш пример находится на правильном пути, но он неполон. Также ваше объяснение неясно. Не могли бы вы отредактировать свой ответ, сделав его более похожим на dotnetfiddle.net/Iw0OzB ? Если нет, я, вероятно,
опубликую

0

Родительской функции необходимо virtualключевое слово, а дочерней функции - overrideключевое слово перед определением функции.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.