There are 2 cases when a call will be dispatched dynamically:

  1. When the receiver of the call is statically typed as dynamic
       1: dynamic d = new MyClass();
       2: d.Foo();
  2. 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.