Принципиальная разница: время компиляции (для объекта) и время выполнения (для динамического) разрешение вызовов.Его также называют ранним или поздним связыванием.[Примечание: добавьте ссылку на Microsoft.CSharp для следующего кода для компиляции.]
object o = "Hello world";// fine because a derived type can be assigned to a base type
dynamic d= "Hello world";// fine as well
Type otype=o.GetType();// compiles because it confirms that object has a GetType()
Type dtype=d.GetType();// also compiles but for another reason (i.e.no binding yet)
string upperd= d.ToUpper(); // compiles because no binding yet ( anything goes :)
string uppero= o.ToUpper(); // Fails to compile. Object has no ToUpper() method
Если вы закомментируете последний вызов, приложение должно работать нормально, поскольку CLR, когда оно достигает второго последнеговызовите d.ToUpper () во время выполнения, он будет искать метод ToUpper () в строковом типе и найдет его там (потому что во втором выражении d была назначена строка).Последний вызов не скомпилирован, потому что ToUpper () ищется в типе System.Object во время компиляции, которого, конечно, там не будет.