dynamic与var

可能重复:
dynamic(C#4)和var有什么区别?

.NET 4.0(VS 2010)中的dynamic和var关键字有什么区别? 根据MSDN,dynamic定义是 – dynamic查找允许您编写方法,运算符和索引器调用,属性和字段访问,甚至是绕过C#的正常静态绑定的对象调用,而是dynamicparsing

而var的定义是 – 隐式types的局部variables是强types的,就像你自己声明了types一样,但是编译器决定了types

这在代码上下文中有什么不同?

var a1 = new A(); a1.Foo(1); dynamic a2 = new A(); a2.Foo(1); 

var意味着静态types被推断 – 在你的情况下,它完全等价于

 A a1 = new A(); 

所有的绑定仍然是完全静态的。 如果您查看生成的代码,它将与上面的声明完全相同。

dynamic意思是,所有使用a2expression式都是在执行时绑定的,而不是在编译时绑定的,所以它可以dynamic地运行。 编译器不会检查Foo方法是否存在 – 行为是在执行时确定的。 事实上,如果对象实现了IDynamicMetaObjectProvider它可以决定在执行时如何处理调用,响应任何方法调用(或其他types的用法) – 换句话说,不必是称为“真实”的方法Foo

如果你看看在dynamic情况下生成的代码,你会发现各种奇怪的和精彩的东西正在做的呼叫站点和活页夹。

var是types安全的,因为它使用types推断。 写var a = new A();A a = new A();的简写formsA a = new A(); 。 声明为dynamicvariables不是types安全的,编译器不会检查您调用的方法是否存在。

var情况下,A()在编译期间必须有一个.Foo(int)方法。

dynamic情况下,它不会。