【问题标题】:Is it safe to use newer C# features when building for older .NET Framework versions?在为较旧的 .NET Framework 版本构建时使用较新的 C# 功能是否安全?
【发布时间】:2014-02-10 01:22:17
【问题描述】:

我维护一个 .NET 2.0 库(目前使用 Visual Studio 2013)。

我对库的代码使用了代码检查工具,当该工具建议使用 ?? 运算符或 lambdas 而不是某些代码时,我感到很惊讶。

当我应用建议的编辑并在此之后成功构建库时,我更加惊讶。

为什么 Target Framework 设置为 .NET Framework 2.0 的库可以在其代码中使用 C# 的新功能构建?

为较旧的 .NET Framework 版本构建时使用较新的 C# 功能是否安全?我的意思是,该库的用户只能拥有 .NET Framework 2.0,我希望他们能够使用该库,即使我在其代码中使用 lambda。

【问题讨论】:

  • Re Lambdas:看看here。只要确保团队中的其他人都在使用 VS >= 2010
  • ?? 是 C#2 功能。 Lambda 是一种编译器功能,因此您可以在面向 .Net 2 时使用它们,但在 .Net 3.5 中定义的委托类型(ActionFunc 等)将不可用。
  • 卡在一个 9 年前的免费库版本上是非常低效的。你的工具供应商当然没有这个问题:)
  • @HansPassant 是的,我很乐意从 2.0 迁移到 4.0(至少),但是该库被使用旧版本开发工具的人使用,我可以将它们抛在后面。不过,也许这是另一个版本的鸡和蛋问题。

标签: c# .net visual-studio


【解决方案1】:

.NET 2.0 和 C# 2.0 是两个不同的东西。在您的情况下,您完全可以拥有一个 .NET 2.0 库(以 CLR 2.0 为目标)并使用支持例如 lambda 表达式的 C# 3.0 编译器。

因此,您应该区分您的编译器版本和您所针对的 CLR 版本。由于您使用的是 VS 2013,因此您可以使用更新版本的编译器。

在为较旧的 .NET Framework 版本构建时使用较新的 C# 功能是否安全?

是的,绝对安全。生成的程序集仍以 CLR 2.0 为目标,并且可以在此旧版本的 CLR 上正常运行。

【讨论】:

  • 我还要补充一点,你甚至可以在使用 .NET 2.0 时使用 LINQ,方法是使用 LINQBridge
【解决方案2】:

基本上,新的 C# 语言功能可以在编译器中实现,而无需扩展底层 .net 框架。它并不总是那样做,但它可能是。

对于 lambda,它们是在 C# 3.0 中引入的。因此,您需要该级别或更高级别的编译器。但是,C# 3.0 中引入的新特性都是使用 .net 2.0 的特性构建的。所以你可以在 .net 2.0 下使用 lambdas。

本质上,这里的新功能是在编译器而不是框架中实现的。

至于 null 合并运算符 ??,它是在 C# 2.0 中引入的,因此能够在 .net 2.0 下使用它也就不足为奇了。

【讨论】:

  • 只是一个小评论,但问题没有提到可空类型 (? "operator"),只是在 .NET 2.0 中引入的 coalesce (??) 运算符.
猜你喜欢
  • 2019-02-18
  • 2019-03-20
  • 2015-08-02
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多