动态关键字问题

请告诉我在哪个版本中引入了动态关键字? 我在VS2010中发现了奇怪的行为。 我将目标框架设置为3.5。 但是没有编译器错误。 只需将目标框架的控制台应用程序创建到.net 3.5并使用dynamic关键字。

动态关键字是作为C#4.0语言的一部分引入的 – 编译器随VS 2010一起提供。它是一种语言特性,不需要运行时支持(AFAIK),因此一旦符合C#4.0编译器,就不应该对早期版本的运行时有任何问题。 在VS 2010中更改目标框架不会切换编译器(保持在4.0) – 只有在使用针对新库或运行时的function时,才会收到编译器错误。 例如,在VS 2008中,您可以对目标运行时2.0使用lambda表达式或var关键字,但扩展方法不可用,因为扩展属性是3.5程序集的一部分。

编辑:上面的错误 – 动态关键字需要Framework 4.0。 当目标fx改为3.5时,我甚至无法在VS2010中编译。 我相信OP可能以后没有在代码中使用动态var,因此编译器优化会删除它,使OP相信它的工作。

动态类型是在.Net 4.0中引入的。

动态类型不是仅语言特性(即编译器纯粹支持)。 它依赖于DLR,这是一个需要库支持的.Net 4.0特性。

您不能使用动态和目标.Net 3.5框架。

使用Visual Studio 2010 ,默认为C# 4.0

您不能在Visual Studio 2010使用C# 3.0

即使你的目标是.Net Framework 3.5 ,它也只使用Framework 3.5而不是C# 3.0

现在,由于它默认为C# 4.0 ,因此您可以使用dynamic 。 但要实现这一点,您必须引用Microsoft.CSharp.dll 。 该程序集使用v 4.0编译。 您不能在v 3.5下使用它。

dynamic需要DLR (Dynamic Language Runtime) ,这是以前的框架版本所不具备的。

这就是为什么当你尝试在Framework 3.5项目下使用dynamic ,它会吓坏。

所以,总结一下,要使用dynamic ,请使用Framework 4.0

仅仅为了知识:这种技术被称为“通过后期绑定的多态性”

它是在.NET Framework 1.1中引入的。 C#在4.0版中获得了此function。 在Visual Basic中,可以启动此withoud编译错误。

 Public Class Foo Public Sub Bar() End Sub End Class Public Class Test Public Sub Test() Dim o as Object o = New Foo() ' This will compile and work o.Bar() ' This will also compile but will throw an exception o.NonExistingMember() End Sub End Class 

`

所有技巧都在于“对象”类型扮演顶级父级的角色,并充当动态变量