动态是否与Object相同

在“CLR via C#”一书中提到动态关键字对应的FCL类型是System.Object。 请澄清一下。

从C#的角度来看,它不是一回事……但是在编译的代码中,声明为dynamic类型的变量通常(可能总是)与CLR字段或object类型的局部变量对应。

C#编译器负责确保使用该值的任何源代码都应用了动态行为。 object只是表示用于存储的编译器。 它还适用于[Dynamic]属性,以便其他代码知道它将被动态处理。

例如,考虑一下:

 public class Foo { public dynamic someField; } 

我相信将编译成IL相当于:

 public class Foo { [Dynamic] public object someField; } 

现在,如果你写:

 Foo foo = new Foo(); foo.someField = "hello"; Console.WriteLine(foo.someField.Length); 

编译器使用该属性来知道foo.someField是动态的,因此应该动态绑定Length属性。

来自MSDN :

类型是静态类型,但动态类型的对象绕过静态类型检查。 在大多数情况下,它的function类似于具有类型对象。

而且 :

在大多数情况下,类型动态类似于类型对象。 但是,包含dynamic类型表达式的操作不会被编译器解析或进行类型检查。 编译器将有关操作的信息打包在一起,该信息稍后用于评估运行时的操作。 作为过程的一部分, dynamic类型的变量被编译为object类型的变量 。 因此,类型dynamic仅在编译时存在,而不是在运行时存在。

(强调我的)

由于dynamic引用需要能够采用任何类型,因此它实际上是类型object (或至少对所有外观和用途),但编译器不会对其执行某些类型检查。