c# - C#编译器版本和语言版本的区别

标签 c# .net visual-studio-2010 compiler-construction visual-studio-2013

有一段时间我认为Framework版本和C#版本是一回事,所以一旦你在电脑上安装了下一个Framework版本,你就应该使用它。

后来发现框架和C#版本没有直接 Hook ,同一台机器上可以共存多个C#编译器,所以编译器和C#版本应该是一样的。

现在明白编译器版本和C#版本不一样了...


Visual Studio 命令提示符(2010):C:\>csc

Microsoft (R) Visual C# 编译器版本 4.0.30319.33440
适用于 Microsoft (R) .NET Framework 4.5


VS 2013 的开发人员命令提示符:C:\>csc

Microsoft (R) Visual C# 编译器版本 12.0.30110.0
适用于 C# 5


enter image description here

我们可以看到
- VS 2010 为 C#4 使用编译器版本 4.0(??我只是可以假设,因为没有明确提到);
- VS 2013 使用 C# 5 的编译器版本 12.0(已明确提及)

知道compiling using different language versions could bring different results给用户

问题

  • 如何找出哪个 C# 版本(不是编译器版本,而是语言版本)使用 VS 构建我的具体项目?

  • C# 编译器语言 版本之间是否存在严格、清晰和透明的联系?

  • 我能否指示 Visual Studio(在从一个 Studio 版本到另一个版本的迁移问题的情况下)为我的具体解决方案使用不同的编译器版本?

最佳答案

由于没有人给出足够好的答案,我现在就试一试。

首先,C# 现在有微软发布的版​​本历史(显然来自 MVP 帖子),

https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history

因此您可以轻松查看每个新版本添加了哪些新功能。

其次,我们将讨论编译器版本,它们最初是 .NET Framework 的一部分。

下面我列出了几个里程碑(可能不是 100% 正确,有些版本可能会被跳过),

  • csc.exe 1.0 (?) for .NET Framework 1.0(实现 C# 1.0)。
  • csc.exe 2.0(Microsoft (R) Visual C# 2005 编译器版本 8.00.50727.8745)用于 .NET Framework 2.0(实现 C# 2.0,以及 1.0 for兼容性)。
  • csc.exe 3.5(Microsoft (R) Visual C# 2008 编译器版本 3.5.30729.8763)用于 .NET Framework 3.5(实现 C# 3.0 和旧版本)。
  • csc.exe 4.0 (?) for .NET Framework 4.0(实现 C# 4.0 及更早版本)。
  • csc.exe 4.x(如 Microsoft (R) Visual C# 编译器版本 4.7.2053.0)用于 .NET Framework 4.5 及更高版本(实现 C# 5.0,以及年长)。请注意,根据您计算机上的 .NET Framework(4.5.0 到 4.7.1),版本号有很大差异(从 4.x 到 12.x)。

然后 Microsoft 淘汰了旧的 csc.exe(因为它们是 native 可执行文件),并发布了基于 Roslyn 的编译器(尽管仍然是 csc.exe)。与此同时,C# 编译器不再是 .NET Framework 的一部分,而是 VS 的一部分。

It was the same time, that C# compiler, language version, and .NET Framework are fully decoupled, so that you can easily use multi-targeting.

  • Roslyn csc.exe 1.x (?) 实现 C# 6.0 及更早版本。随 VS2015 一起提供。
  • Roslyn csc.exe 2.x(如 Microsoft (R) Visual C# 编译器版本 2.4.0.62122 (ab56a4a6))实现 C# 7.x 及更早版本。随 VS2017 一起提供。

好的,足够的背景。回到你的问题。

Q1:如何找出哪个 C# 版本(不是编译器版本,而是语言版本)使用 VS 构建我的具体项目?

答:从项目设置中可以很容易的看出使用的是什么语言版本。

Advanced settings

如果不选择显式版本,它会自动使用编译项目的csc.exe支持的最新版本。

请注意,@Servy 在@DaniloCataldo 关于 langversion 开关的回答下评论了更多细节。该开关有其设计目标和局限性。因此,例如,即使您强制 Roslyn 2.x 编译器基于 C# 4.0 编译您的项目,编译结果也会与 C# 4.0 编译器不同。

问题 2:C# 编译器和语言版本之间是否存在严格、明确和透明的联系?

回答:请引用我上面描述的背景,我认为这部分已经回答了。有严格、明确、透明的环节。

问题 3:我可以指示 Visual Studio(如果出现从一个 Studio 版本到另一个版本的迁移问题)为我的具体解决方案使用不同的编译器版本吗?

回答:Visual Studio 版本(如 VS2019)坚持 MSBuild 版本 (16.x),因此是 C# 编译器的专用版本。所以一般来说,Q3 与 Q1 是重复的,因为您只能更改语言版本。

There are a bunch of NuGet packages to override C# compiler used by a project, such as https://www.nuget.org/packages/Microsoft.Net.Compilers.Toolset. However, Microsoft states that "Using it as a long term solution for providing newer compilers on older MSBuild installations is explicitly not supported", so you really shouldn't explore that route.

关于c# - C#编译器版本和语言版本的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22814922/

相关文章:

c# - 如何访问 .URL 文件中的 URL 和书签标题?

sql-server-2008 - Visual Studio 2010 与 SQL Server 2008 和 Office 2007 的正确安装顺序?

c# - 当我添加对项目的引用时,Visual Studio/Tools 可以向我显示循环依赖关系图吗?

c# - 基于参数锁定

c++ - 怎么可能知道是什么导致了异常

c# - 在razor View 中,如何将模型属性传递给JavaScript函数并显示返回值?

c# - 正确使用选取框进度条

c# - 如何比较 asp.net 网站中输入字符串的最后 3 个字符

c# - 赢得表格制图

c# - 确定 EnvDTE.Project 是否可用