Consider the following code (it's a little long, but hopefully you can follow):
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);
}
}
If you think the output of this program is "Foo(B)" then you'd be in the same boat as me: completely wrong! In fact, it outputs "Foo(A)"
If I remove the virtual method from the C
class, then it works as expected: "Foo(B)" is the output.
Why does the compiler choose the version that takes a A
when B
is the more-derived class?
C
and remove the correspondingoverride
keyword fromD
, the output becomes"Foo(B)"
. – Kizzie