Каков вариант использования этой наследственной идиосинкразии?

При наследовании унаследованного класса поведение new/override не соответствует моим ожиданиям:

$ cat Program.cs
using System;

class A {
    public virtual void SayHi() {
        Console.WriteLine("From A");
    }
}
class B : A { 
    public new virtual void SayHi()  {
        Console.WriteLine("From B");
    }
}
class C : B { 
    public override void SayHi() {
        Console.WriteLine("From C");
    }
}

public class Program {
    public static void Main() {
        A p = new C();
        p.SayHi();
    }
}

$ ./Program.exe 
From A

Поскольку класс C переопределяет sayHi() метод Я ожидаю, что вывод будет From C. Почему модификатор newкласса B имеет здесь приоритет? Каков вариант его использования? Тем более, что он нарушает очевидный вариант использования

Обратите внимание, что приведенный выше код был запущен на Mono 2.10, работающем в дистрибутиве, производном от Debian, но я подтвердил такое же поведение с помощью компилятора C# в MS Visual Studio.

18
задан dotancohen 14 November 2012 в 16:44
поделиться