动态关键字问题

时间:2010-12-31 06:08:43

标签: c# .net dynamic

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

4 个答案:

答案 0 :(得分:14)

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

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

您无法使用动态并定位.Net 3.5框架。

答案 1 :(得分:11)

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

您无法将C# 3.0Visual Studio 2010一起使用。

即使您定位.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),这对以前的框架版本来说并不存在。

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

总而言之,要使用dynamic,请使用Framework 4.0

答案 2 :(得分:10)

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

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

答案 3 :(得分:1)

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

它是在.NET Framework 1.1中引入的。 C#在4.0版中获得了此功能。在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

`

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