考虑以下代码(它有点长,但希望你能遵循):
class A
{
}
class B : A
{
}
class C
{
public virtual void Foo(B b)
{
Console.WriteLine("base.Foo(B)");
}
}
class D: C
{
public override void Foo(B b)
{
Console.WriteLine("Foo(B)");
}
public void Foo(A a)
{
Console.WriteLine("Foo(A)");
}
}
class Program
{
public static void Main()
{
B b = new B();
D d = new D ();
d.Foo(b);
}
}
如果您认为该程序的输出是“Foo(B)”,那么您将和我在同一条船上:完全错误!事实上,它输出“Foo(A)”
如果我从类中删除虚拟方法C
,那么它会按预期工作:“Foo(B)”是输出。
为什么编译器会选择采用A
whenB
是更多派生类的版本?