C#编译器版本和语言版本之间的区别

ser*_*hio 24 .net c# compiler-construction visual-studio-2010 visual-studio-2013

有段时间我认为Framework版本和C#版本是相同的,所以一旦你在计算机上安装下一个Framework版本,就应该使用它.

然后我发现框架没有直接与C#版本链接,并且在同一台机器上,多个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

用于C#5的 Microsoft(R)Visual C#编译器版本12 .0.30110.0


在此输入图像描述

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

知道使用不同语言版本进行编译可能会给用户带来不同的结果

问题

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

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

  • 我是否可以向Visual Studio指出(如果从一个Studio版本迁移到另一个版本),为我的具体解决方案使用不同的编译器版本?

Lex*_* Li 19

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

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

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

因此,您可以轻松查看为每个新版本添加的新功能.

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

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

  • csc.exe .NET Framework 1.0的1.0(?)(实现C#1.0).
  • csc.exe用于.NET Framework 2.0的2.0(Microsoft(R)Visual C#2005编译器版本8.00.50727.8745)(实现C#2.0,以及兼容性1.0).
  • csc.exe3.5(Microsoft(R)Visual C#2008编译器版本3.5.30729.8763)适用于.NET Framework 3.5(实现C#3.0和旧版本).
  • csc.exe .NET Framework 4.0的4.0(?)(实现C#4.0及更早版本).
  • csc.exe4.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).

然后,微软使旧的csc.exe过时(因为它们是本机可执行文件),并且装运了基于Roslyn的编译器(尽管如此csc.exe).与此同时,C#编译器不再是.NET Framework的一部分,而是VS的一部分.

同时,C#编译器,语言版本和.NET Framework完全解耦,因此您可以轻松使用多目标.

  • Roslyn csc.exe1.x(?)实现了C#6.0及更早版本.装有VS2015.
  • Roslyn csc.exe2.x(如Microsoft(R)Visual C#编译器版本2.4.0.62122(ab56a4a6))实现了C#7.x及更早版本.装有VS2017.

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

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

答:您可以从项目设置中轻松查看使用的语言版本.

高级设置

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

请注意@Servy在@DaniloCataldo关于langversion交换机的回答中有更多详细信息.该开关有其设计目标和限制.因此,例如,即使您强制使用Roslyn 2.x编译器来编译基于C#4.0的项目,编译结果也会与C#4.0编译器的结果不同.

Q2:C#编译器和语言版本之间是否存在严格,清晰和透明的链接?

答:请参考我上面描述的背景,我认为已经回答了这一部分.有一个严格,清晰和透明的链接.

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

答:与Q1重复.


Aik*_*Aik 3

过去,Visual Studio 2005 仅修复了一个 .Net 版本,并且随该版本提供了 C# 编译器。如果你想使用较新版本的 VS,你还必须切换 Visual Studio。现在,Visual Studio 可以针对多个 .Net 版本,甚至可以将新的 C# 编译器与旧的 .Net 框架(.Net 2.0 中的 lambda 或扩展方法)混合在一起。简单来说C#编译器版本与C#语言版本有关

您可以在项目文件(以 xml 形式打开)中检查编译器版本,并且 Project 元素有ToolsVersion属性。

在我的特定项目中,有ToolsVersion="4.0",我的目标项目是.Net 2.0。这意味着我可以在旧框架中使用新的语言构造,这在 VS2005 中是不可能的。