C#编译器版本和语言版本之间的区别
曾经有人认为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
Microsoft(R)Visual C# 编译器版本 12.030110.0
对于C#5
我们可以看到
- VS 2010使用C#4的编译器版本4.0(??我可以假设它,因为没有明确提到);
- VS 2013使用C#5的编译器版本12.0(这是明确提到的)
知道使用不同的语言版本进行编译可能会给用户带来不同的结果
问题
如何找出C#版本 (不是编译器,而是语言版本)使用VS来构建我的具体项目?
C# 编译器和语言版本之间是否存在严格,清晰和透明的链接?
我是否可以向Visual Studio指出(如果从一个Studio版本到另一个Studio版本发生迁移问题)为我的具体解决方案使用不同的编译器版本?
由于没有人给出足够好的答案,我现在就试一试。
首先,C#有微软现在发布的版本历史(明显来自MVP的帖子),
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history
因此,您可以轻松查看每个新版本添加了哪些新功能。
其次,我们将讨论编译器发布,最初是.NET Framework的一部分。
下面我列出几个里程碑(可能不是100%正确,有些版本可能会跳过),
csc.exe
1.0(?)(实现C#1.0)。 csc.exe
2.0( Microsoft(R)Visual C#2005编译器版本8.00.50727.8745 )(实现C#2.0以及兼容性为1.0)。 csc.exe
3.5( Microsoft(R)Visual C#2008编译器版本3.5.30729.8763 )。 csc.exe
4.0(?)(实现C#4.0及更早版本)。 csc.exe
4.x( 如Microsoft(R)Visual C#Compiler version 4.7.2053.0 )(实现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完全分离,以便您可以轻松使用多目标定位。
csc.exe
1.x(?)实现了C#6.0及更早版本。 随VS2015发货。 csc.exe
2.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编译器所做的不同。
问题2:C#编译器和语言版本之间是否存在严格,清晰和透明的链接?
答:请参考我上面描述的背景,我认为已经回答了这部分。 有一个严格,清晰和透明的链接。
问题3:我可以向Visual Studio表明(如果从一个Studio版本到另一个Studio版本发生迁移问题)为我的具体解决方案使用不同的编译器版本?
答案:重复到Q1。
在过去,Visual Studio 2005仅被固定为一个.Net版本和C#编译器。 如果你想使用更新版本的VS,你也必须切换Visual Studio。 现在,Visual Studio可以定位到多个.Net版本,甚至可以将新的C#编译器与旧的.Net框架(在.Net 2.0中的lambda或扩展方法)混合使用。 Simply C#编译器版本与C#语言版本有关 。
您可以在项目文件中检查您的编译器版本(将其打开为xml),并且有Project元素的ToolsVersion属性。
在我的具体项目中有ToolsVersion =“4.0” ,我的目标项目是.Net 2.0 。 这意味着我可以在旧框架中使用新的语言构造,这在VS2005中是不可能的。
只是添加到以前的答案。 您应该知道,虽然C#语言和C#编译器与.Net框架是分开的,但仍然依赖于它。
例如,C#5具有等待/异步语言功能,但不能与.Net 4一起使用,至少不能没有一些额外的操作和nuget软件包。
另一方面,您仍然可以使用.NET 4.0的C#6的nameof或null传播特性,因为它们纯粹是由编译器实现的
链接地址: http://www.djcxy.com/p/21329.html上一篇: Difference between C# compiler version and language version
下一篇: Foreach Variable in Closure. Why Results Differ for These Snippets?