【问题标题】:C# 4.0 and .Net 3.5C# 4.0 和 .Net 3.5
【发布时间】:2011-09-07 06:37:37
【问题描述】:

所以我们终于在一些开发人员站上安装了 VS2010,并且可以使用 C# 4.0 功能。尽管我们开发的大部分内容暂时仍要针对 .Net 3.5。

当我开始一个新项目并将目标设置为 .Net 3.5 时,它仍然允许我使用动态等 C# 4.0。因此,您能否在面向 .net 3.5 的同时使用 C#4.0 功能?这些功能是否可以在 .Net 4.0 不可用的环境中工作?

谢谢。

【问题讨论】:

  • 是的,这很奇怪。我注意到在我们的应用程序上也是如此,我们的应用程序是 2.0。我会对答案很感兴趣。

标签: c# .net .net-3.5


【解决方案1】:

如果您以 .NET 3.5 框架为目标,dynamic 代码将无法编译。

更清楚地说,编译器将允许您定义和分配一个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 相关的所有内容。这些在 .NET 3.5 中不可用。所以答案是否定的,你不能使用dynamic 定位框架版本 3.5。

【讨论】:

  • 我经常想知道有什么不同。谢谢你 Aaronaught
  • 阅读该错误让我想知道,那么如果您将这 2 个 dll 作为本地副本包括在内会发生什么,这就足够了吗?或者它永远不会找到那些用于选择旧框架的 GAC 版本的 dll?
  • @Chris:Microsoft.CSharp 实际上并不包含 DLR; DLR 是框架本身的一部分。所以不,包括那个 DLL 对你没有帮助;即使你确实让它编译了,它实际上也不会运行。
  • +1 如果您搜索了 Aaronaught 列出的 2 条错误消息,另一种解决方案是添加对 Microsoft.CSharp 4.0 的引用
  • Jeremy - 你不能从 .NET 3.5 引用 Microsoft.CSharp 4.0 我不认为?
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2011-07-05
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2012-06-30
相关资源
最近更新 更多