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

时间:2014-04-02 14:40:17

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

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

然后我发现框架没有直接与C#版本链接,并且在同一台机器上,多个C#编译器可以同居,所以编译器和C#版本可能是相同的。

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


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

Microsoft(R)Visual C#编译器版本4 .0.30319.33440
for 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使用编译器版本4.0作为C#4(??我可以假设它,因为没有明确提到);
- VS 2013使用C#5的编译器版本12.0(这是明确提到的)

了解compiling using different language versions could bring different results给用户

问题

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

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

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

4 个答案:

答案 0 :(得分:14)

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

首先,C#现在已经发布了Microsoft的版本历史(明显来自MVP帖子),

https://docs.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)。
  • 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过时(因为它们是本机可执行文件),并且改为运行基于Roslyn的编译器(尽管仍然是csc.exe)。与此同时,C#编译器不再是.NET Framework的一部分,而是VS的一部分。

  

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

  • 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编译器的结果不同。

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

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

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

答案:与Q1重复。

答案 1 :(得分:3)

只是添加到上一个答案。 您应该知道,虽然C#语言和C#编译器与.Net框架是分开的,但它们仍然依赖于它。

例如,C#5具有等待/异步语​​言功能,但您不能将其与.Net 4一起使用,至少在没有一些额外操作和nuget包的情况下使用它。

另一方面,您仍然可以使用.Net 4.0的C#6的名称或空传播功能,因为它们完全由编译器实现

答案 2 :(得分:2)

过去,Visual Studio 2005仅修复了此版本提供的一个.Net版本和C#编译器。如果您想使用较新版本的VS,您还必须切换Visual Studio。现在Visual Studio可以针对多个.Net版本,它甚至可以将新的C#编译器与旧的.Net框架(lambdas或.Net 2.0中的扩展方法)混合使用。只需 C#编译器版本与C#语言版本相关。

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

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

答案 3 :(得分:-1)

要向Visual Studio指示使用哪种语言版本,有一个名为/ langversion的编译器选项 你可以找到更多相关信息here
它也可以通过编程方式设置,如here所述。
编译器可以在不同版本的语言中编译,语言版本与框架的版本没有直接关系,但是通常使用语言功能,它可以使用最小的框架。
就在几分钟前,我在VS 2015中编译了一个使用c#6.0字符串插值的dll

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

并将框架4.0作为目标。 它编译并正常工作。 This post解释版本纠缠,但仅适用于较旧的c#版本。