Почему этот код C # прекрасно компилируется, когда существует неоднозначный виртуальный метод? - PullRequest
6 голосов
/ 27 мая 2010

У меня есть класс (класс B), который наследует другой класс (класс A), который содержит виртуальные методы.

По ошибке я пропустил ключевое слово override при объявлении (как предполагается,) метода переопределения в классе B.

Класс A

public class ClassA{
    public virtual void TestMethod(){
    }
}

Класс B

public class ClassB : ClassA{
    public void TestMethod(){
    }
}

Код скомпилирован без проблем. Кто-нибудь может объяснить, почему?

Ответы [ 3 ]

7 голосов
/ 27 мая 2010

Это не двусмысленно. Он должен скомпилироваться с предупреждением о том, что вы должны либо указать «новый», либо «переопределить» и что по умолчанию это «новый».

Это определенно выдает предупреждение, когда я пытаюсь скомпилировать этот код - когда вы говорите, что он компилируется "нормально" и "без проблем", вы игнорируете предупреждения?

1 голос
/ 27 мая 2010

Компилятор C # выдает предупреждение. Я советую вам всегда компилировать «предупреждения как ошибки».

0 голосов
/ 27 мая 2010

класс B должен быть

public class ClassB : ClassA{
    public override void TestMethod(){
    }
}

но он может скомпилироваться без переопределения - он должен сгенерировать предупреждение, что, если это было задумано, вам нужно добавить новое ключевое слово

public class ClassB : ClassA{
    public new void TestMethod(){
    }
}

оформить заказ это для получения дополнительной информации

...