2011-01-14 72 views
3

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

回答

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本身ty应该是动态绑定的。

2

MSDN来自:

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

And

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

(重点煤矿)

由于dynamic参考需要能够采取任何类型,它在类型object的效应(或至少到所有出现,并使用),但编译器不会对其执行某些类型的检查。