动态是否与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
(或至少对所有外观和用途),但编译器不会对其执行某些类型检查。