请告诉我在哪个版本中引入了动态关键字?我在VS2010中发现了奇怪的行为。我将目标框架设置为3.5。但是没有编译器错误。只需将目标框架的控制台应用程序创建到.net 3.5并使用dynamic关键字。
答案 0 :(得分:14)
动态类型是在.Net 4.0中引入的。
动态类型不仅是语言特性(即编译器纯粹支持)。它依赖于DLR,这是一个需要库支持的.Net 4.0特性。
您无法使用动态并定位.Net 3.5框架。
答案 1 :(得分:11)
使用Visual Studio 2010
时,默认为C# 4.0
。
您无法将C# 3.0
与Visual 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
`
所有技巧都在于"对象"扮演顶级父母的角色,并充当动态变量