动态关键字问题
请告诉我在哪个版本中引入了动态关键字? 我在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
`
所有技巧都在于“对象”类型扮演顶级父级的角色,并充当动态变量