由于没有人给出足够好的答案,我现在来试一试。
首先,C#现在已经由Microsoft发布其版本历史(显然来自MVP帖子),
https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history
所以你可以轻松地看到每个新版本中添加了哪些新特性。
其次,我们将讨论编译器发布,这最初是.NET Framework的一部分。
下面我列出了一些里程碑(可能不是100%正确,有些版本可能被跳过),
csc.exe
1.0(?)用于.NET Framework 1.0(实现了C# 1.0)。
csc.exe
2.0(Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.8745)用于.NET Framework 2.0(实现了C# 2.0,以及1.0以保持兼容性)。
csc.exe
3.5(Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.8763)用于.NET Framework 3.5(实现了C# 3.0和早期版本)。
csc.exe
4.0(?)用于.NET Framework 4.0(实现了C# 4.0和早期版本)。
csc.exe
4.x(例如 Microsoft (R) Visual C# Compiler version 4.7.2053.0)用于.NET Framework 4.5及以上版本(实现了C# 5.0和早期版本)。请注意,版本号因您计算机上的.NET Framework而异(从4.x到12.x,从4.5.0到4.7.1)。
微软将旧的csc.exe
(因为它们是本机可执行文件)作废,并改用基于Roslyn的编译器代替(尽管仍然使用csc.exe
)。与此同时,C#编译器不再是.NET Framework的一部分,而是Visual Studio的一部分。
同时,C#编译器、语言版本和.NET Framework已完全解耦,因此您可以轻松地使用多目标。
- Roslyn
csc.exe
1.x (?) 实现了 C# 6.0 及更早版本,随VS2015一起发布。
- Roslyn
csc.exe
2.x(类似于 Microsoft (R) Visual C# Compiler 版本 2.4.0.62122 (ab56a4a6))实现了 C# 7.x 及更早版本,随VS2017一起发布。
好了,足够背景知识了。回答你的问题。
Q1:如何找出 VS 使用哪个 C# 版本(不是编译器版本)来构建我的具体项目?
答:您可以从项目设置中轻松看出所使用的语言版本。
![高级设置](https://istack.dev59.com/n3V6X.webp)
如果您没有选择明确的版本,它可以自动使用csc.exe
编译项目支持的最新版本。
请注意,@Servy 在 @DaniloCataldo 的答案下评论了langversion
开关的更多详细信息。该开关具有其设计目标和限制。因此,即使您强制Roslyn 2.x编译器基于C# 4.0编译您的项目,编译结果也会与C# 4.0编译器不同。
Q2:C#编译器和语言版本之间是否存在严格、清晰和透明的联系?
答案:请参考我上面描述的背景,我认为已经回答了这部分内容。存在一个严格、清晰和透明的链接。
Q3:如果从一个Visual Studio版本迁移时遇到的问题,我可以指示Visual Studio使用不同的编译器版本来解决吗?
答案:Visual Studio发布(如VS2019)会固定于一个MSBuild版本(16.x),因此会有一个专用版本的C#编译器。因此,通常情况下Q3是重复的Q1,因为您只能更改语言版本。
有一堆NuGet包可以覆盖项目使用的C#编译器,例如https://www.nuget.org/packages/Microsoft.Net.Compilers.Toolset。然而,微软表示“将其用作在旧版MSBuild安装上提供更新的编译器的长期解决方案明确不受支持”,因此您真的不应该探索那条路。