C#编译器版本和语言版本之间的差异

C#编译器版本和语言版本之间的差异,c#,.net,visual-studio-2010,compiler-construction,visual-studio-2013,C#,.net,Visual Studio 2010,Compiler Construction,Visual Studio 2013,曾经有一段时间,我认为框架版本和C#版本是一样的,所以一旦你在计算机上安装了下一个框架版本,你就应该使用它 然后我发现框架与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#版本是一样的,所以一旦你在计算机上安装了下一个框架版本,你就应该使用它

然后我发现框架与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

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


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

知道这一点对用户来说很重要

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

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

  • 我是否可以指示Visual Studio(在从一个Studio版本迁移到另一个Studio版本时)为我的具体解决方案使用不同的编译器版本


在过去,VisualStudio2005只固定为一个.Net版本,C#编译器随此版本提供。如果您想使用较新版本的VS,还必须切换Visual Studio。现在VisualStudio可以针对多个.Net版本,甚至可以将新的C#编译器与旧的.Net框架(lambdas或.NET2.0中的扩展方法)混合使用。简单地说,C#编译器版本与C#语言版本相关

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


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

只是为了补充前面的答案。 您应该知道,虽然C语言和C编译器与.Net framework是分开的,但它们仍然依赖于.Net framework

例如,C#5具有wait/async语言特性,但在.NET4中不能使用它,至少在没有一些额外的操作和nuget包的情况下不能


另一方面,您仍然可以在.Net 4.0中使用C#6的nameof或null传播特性,因为它们完全由编译器实现,以向Visual Studio指示要使用的语言版本有一个名为/langversion的编译器选项
您可以找到更多关于它的信息。
如前所述,它也可以通过编程进行设置。
编译器可以编译语言的不同版本,语言版本与框架的版本没有直接关系,但通常使用一种语言功能时,有一个它可以工作的最低框架。
几分钟前,我在VS2015中编译了一个dll,它使用c#6.0的字符串插值

并以框架4.0为目标。 它编译并运行良好。
解释版本纠缠,但仅适用于较旧的c#版本。

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

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

因此,您可以很容易地看到每个新版本都添加了哪些新功能

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

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

  • csc.exe
    1.0(?)用于.NETFramework 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(?)用于.NETFramework4.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)
然后,微软淘汰了旧的
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来构建我的具体项目?

答:您可以很容易地从项目设置中看到所使用的语言版本

如果您不选择显式版本,它可以
var version = 4;
var output = $"{version}";