动态是否与Object相同

时间:2011-01-14 09:59:33

标签: c# asp.net

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

2 个答案:

答案 0 :(得分:5)

从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属性应该是动态绑定的。

答案 1 :(得分:2)

来自MSDN

  

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

And

  

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

(强调我的)

由于dynamic引用需要能够使用任何类型,因此 的类型为object(或至少所有外观和用途),但编译器不会对它进行某些类型检查。