When does the compiler dispatch a call dynamically?
There are 2 cases when a call will be dispatched dynamically:
When the receiver of the call is statically typed as dynamic
1: dynamic d = new MyClass(); 2: d.Foo();
When any of the arguments to the call are statically typed as dynamic
1: var o = new MyClass(); 2: dynamic d = 4; 3: o.Bar(d);
By keeping the rules simple we hope to avoid cases where there is confusion about whether or not a call is dispatched dynamically.