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)
I think it is because in case of a non-virtual method the compile time type of the variable on which the method is invoked is used.
You have the Foo method which is non-virtual and hence that method is called.
This link has very good explanation http://msdn.microsoft.com/en-us/library/aa645767%28VS.71%29.aspx