The Microsoft .NET Framework SDK documentation incorrectly describes the C# inheritance process, stating that the method called is dependent on the the run-time type of an object. Methods can be called either from outside the object (in which case the reference type determines the method called) or inside the object (in which case the calling point type determines the method called).
Calling from outside the object
When calling a method on an object, the reference type determines the method called.
If B is a subclass of A (either directly or indirectly) and b is an object of type B then the call ((A)b).someMethod() may not yield the same result as the call B.someMethod(), because the first call is on an object of reference type A.
The C# interpreter first looks for a method of the same name in the reference type class, and if it is not found there then the superclasses are searched (the method must exist in one, otherwise the program would not have compiled).
Next the C# interpreter searches subclasses for a method of the same name with the override modifier, stopping if it encounters a method of the same name with the new modifier.
The method that is called is the last override of the method found in the original search (or that method itself if it is not overridden).
Calling from inside the object
The methods of an object may call other methods on the same object. In this case the type of the class in which the calling method resides determines which method is called. Class are searched, starting with this type, in the same way as described above. Note that this is not affected by either the run-time type or reference type of the object on which the original call was made.