【问题标题】:C# 7 .NET / CLR / Visual Studio version requirementsC# 7 .NET / CLR / Visual Studio 版本要求
【发布时间】:2026-01-24 07:45:01
【问题描述】:

运行 C# 7 的最低 .NET 框架和 CLR 版本要求是什么?另外,我需要 VS 2017 来编译 C# 7 吗?

【问题讨论】:

  • 任何 .NET 版本 4.6.x 都可以。 Roslyn 是开源的,所以一切皆有可能。如果您希望有人为您做,请下载 VS2017。它是昨天发布的。社区版是免费的。
  • 可以使用 Visual Studio 2015 - 参见,例如this question.

标签: c# .net requirements c#-7.0


【解决方案1】:

您不需要以 .NET 4.6 及更高版本为目标,这是不正确的。要使用元组,您需要 System.ValueTuple NuGet 包。在https://www.nuget.org/packages/System.ValueTuple/ 上,你可以看到它说它支持 4.5 及更高版本,实际上它支持 4.0 及更高版本。而且,如果您想发疯,如果您创建自己的 System.ValueTuple 类,该类完全符合该程序包的功能,那么它将在 .NET 3.5 甚至更早版本上运行。对于“类任务”类型,您还需要一个 NuGet 包,https://www.nuget.org/packages/System.Threading.Tasks.Extensions/。根据其文档,此包也适用于 .NET 4.5 和更新版本。

其他 C# 7 功能仅适用于 .NET 2 及更高版本,因为它们只是语法糖。例如,我刚刚在 .NET 2.0 中编写了以下内容,它正确抛出:

static void Main(string[] args)
{
    string test = null;
    string d = test ?? throw new ApplicationException("test");
}

同样,int.TryParse("123", out int i); 在 .NET 2.0 中也可以正常工作。

我没有测试每一个 C#7 特性,但总的来说,除了元组(及其相关特性,如解构)之外,它应该在 .NET 2.0 及更高版本中工作,因为它大部分只是语法糖。话虽如此,是的,您需要 VS2017 来编译 C#7。我敢肯定,其他编译器会在某个时候支持 C#7,但现在不会。

我确认在 .NET 2.0 中工作的功能:

  • 二进制字面量
  • 数字分隔符
  • 内联out参数
  • 使用_丢弃参数
  • 本地函数
  • 基于类型的模式匹配if (obj is int i)case int i:
  • 常量模式匹配if (i is 2)
  • Var 模式匹配if (i is var j)
  • 参考返回
  • 抛出表达式
  • 表达式体的 getter 和 setter
  • 表达式体构造函数和终结器

【讨论】:

  • 为什么投反对票?我的回答有什么不准确之处?
  • 向我投赞成票,但值得一读 this answer,因为新的异步功能也需要一个 nuget 包。
  • @DavidArno 谢谢,忘记了这个功能。我更新以包含有关该 nugget 包的信息。不幸的是,对于 C# 7 已经“考虑”了很多事情,很难找到一个完整的列表,因为 VS2017 的发行说明似乎不完整,只提到了最大的特性添加。
  • 很难找到真正放入 C# 7 的内容,很少有人说出更真实的话。可悲的是,我怀疑其中许多文章是几个月前写的,永远不会更新以反映真实的功能列表。
【解决方案2】:

要立即使用 C# 7 的全部功能(不引用 NuGet 包等),您需要 VS 2017 和 .NET 4.7 作为目标框架。

【讨论】:

  • 我从您的回答中删除了“请评论否决票”。那是评论,不是您答案的一部分。但是要猜测投票的原因,我会这样做:a)您没有为您的主张提供任何证据,b)这是错误的(您可以通过添加 System.NET 4.6.2 及更低版本来定位.NET 4.6.2 及以下版本ValueTuple Nuget 包 - 请参阅 this answer.
  • @WaiHaLee 不提供证明不会导致答案错误。但感谢您指出这一点。当我的答案包含短语“不引用 NuGet 包”时,您说“这是错误的(您可以...通过添加包)”。
  • 对不起 - 是的:你是对的 - 你确实指出了 NuGet 包的要求。不知怎的,这让我失去了注意力。