C# 4.0 and .Net 3.5

29

我们终于在工作中的一些开发者站点上安装了VS2010,可以使用C# 4.0的功能。尽管我们大部分开发仍需针对.Net 3.5进行。

当我启动一个新项目并将目标设置为.Net 3.5时,它仍允许我使用C# 4.0,例如dynamic。因此,在针对.Net 3.5时,您可以使用C# 4.0的特性,并且这些特性是否能在没有.Net 4.0的环境下工作?

谢谢。


是的,这很奇怪。我也注意到我们的应用程序有这个问题,而且我们的版本是2.0。我对答案很感兴趣。 - Jon
1个回答

44

dynamic代码如果针对.NET 3.5框架进行编译将无法通过。

更明确地说,编译器将允许您定义分配一个dynamic变量,例如:

dynamic x = 3;

那一行代码会被编译,因为在类型方面dynamic只被编译为object。但如果您尝试对该变量进行任何操作,例如:

Console.WriteLine(x);

如果那样做,编译器将不得不生成代码来发现/强制转换真实的类型,而它无法做到;你将收到以下编译错误:

  1. 预定义类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入
  2. 一个或多个用于编译动态表达式所需的类型未找到。您是否缺少对Microsoft.CSharp.dll和System.Core.dll的引用?

C#4编译器依赖DLR,特别是Microsoft.CSharp程序集,来处理与dynamic相关的所有内容。这些在.NET3.5中不可用。因此,答案是否定的,当针对Framework版本3.5时,无法使用dynamic


1
我经常想知道它们之间的区别。谢谢Aaronaught。 - Gustavo Mori
阅读该错误信息让我想知道,如果将这两个dll设置为“复制到本地”,那么是否就足够了?还是老版本框架的GAC版本总是会被选中而永远找不到那些dll? - Chris Marisic
1
@Chris:Microsoft.CSharp实际上并没有“包含”DLR;DLR是框架本身的一部分。因此,包括那个DLL也无济于事;即使您成功编译它,它也无法运行。 - Aaronaught
5
如果你谷歌了Aaronaught列出的2个错误信息,则另一个解决方法是只需添加对Microsoft.CSharp 4.0的引用。 - Jeremy Thompson
Jeremy - 你觉得从.NET 3.5引用Microsoft.CSharp 4.0可行吗? - NickG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接