为什么忽略基类中声明的签名?

San*_*eep 9 c# inheritance

class Base
{
    public virtual void MethodA(int x)
    {
        Console.WriteLine ("In Base Class");
    }
}

class Derived : Base
{
    public override void MethodA(int x)
    {
        Console.WriteLine ("In derived INT)");
    }

    public void MethodA(object o)
    {
        Console.WriteLine ("In derived OBJECT");
    }
}

class Test
{
    static void Main()
    {
        Derived d = new Derived();
        int k = 20;
        d.MethodA(k);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是" In derived OBJECT ".这种奇怪行为的原因是什么?经过一番研究,我发现原因是忽略了基类中声明的签名.他们为什么被忽视?

Eri*_*ert 6

这是设计上有充分理由的.此设计有助于防止脆弱的基类问题.C#旨在使编写"版本化"组件变得更容易和更安全,而这个规则是其中很重要的一部分.

这是一个非常常见的问题.这是我们得到的最常见的"错误报告"之一; 也就是说,有人认为他们在编译器中发现了一个错误,实际上他们已经找到了一个功能.

有关该功能的说明及其设计原因,请参阅我关于此主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx

有关各种语言如何处理脆弱基类问题的更多文章,请参阅我关于该主题的文章存档:

http://blogs.msdn.com/b/ericlippert/archive/tags/brittle+base+classes/