Does C# 6.0 work for .NET 4.0?
我创建了一个示例项目,以C 6.0 Goodies-空传播和属性初始化为例,设置目标版本.NET 4.0,它…作品。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Cat { public int TailLength { get; set; } = 4; public Cat Friend { get; set; } public string Mew() { return"Mew!"; } } class Program { static void Main(string[] args) { var cat = new Cat {Friend = new Cat()}; Console.WriteLine(cat?.Friend.Mew()); Console.WriteLine(cat?.Friend?.Friend?.Mew() ??"Null"); Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0); } } |
- 维基百科说,C 6.0的.NET框架是4.6。
- 这个问题(以及Visual Studio 2015 CTP测试)表明clr版本是4.0.30319.0。
- 这个msdn页面说.net 4、4.5、4.5.2使用clr 4。没有关于.NET 4.6的任何信息。
这是否意味着我可以为针对.NET 4.0的软件使用C 6.0功能?有什么限制或缺点吗?
是的(大部分)。C 6.0需要新的Roslyn编译器,但是新的编译器可以针对旧的框架版本进行编译。这仅限于不需要框架支持的新功能。
例如,虽然您可以将C_6.0中的字符串插值功能与早期版本的.NET一起使用(因为它会导致对
1 2 | int i = 3; string s = $"{i}"; |
您需要.NET 4.6与
1 2 | int i = 3; IFormattable s = $"{i}"; |
您提到的案例不需要框架中的类型即可工作。因此编译器完全能够支持旧框架版本的这些特性。
只想关注如何理解维基百科和其他链接。
当维基百科说C 6.0与.NET Framework 4.6结合使用时,它仅仅意味着编译器的生产版本(msc.exe)将成为.NET Framework 4.6版本的一部分。通过多目标,这样的编译器可以支持更低版本的.NET框架版本。当然,自从Roslyn成为一个开源项目以来,编译器现在完全是一个单独的组件。
当某些内容引用4.0.30319(.0)的CLR版本时,实际上可以是.NET Framework 4.*(4.0,4.0.*,4.5,4.5.*,4.6,4.6.*),因为它们都实现了CLR版本4规范。更不用说Xamarin/mono也实现了相同的clr规范。
msdn页尚未完全更新,但某些页的.NET Framework 4.6已在版本信息部分列出。
总之,语言规范(以及C编译器)、clr规范和.NET框架版本之间没有紧密耦合。它确实给了开发人员足够的灵活性来利用新的编译器来瞄准旧的CLR和.NET框架。
是的,您可以对旧框架使用较新的编译器,并访问新的编译器功能(只要这些功能不需要在.NET 4.6中引入新类型)。
这方面的其他示例包括使用默认参数的方法,这些方法是在C 4.0(.NET 4.0)中引入的,但您可以在.NET 2.0(C 2.0)和.NET 3.5(C 3.0)项目中使用它们。
如果您做一个小的变通来让编译器满意,那么您也可以在.NET 2.0或.NET 3.0中使用扩展方法(在C_3.0中引入),这样它就可以找到.NET 3.5中引入的属性。
@oobe的回答实际上很重要。我只能在使用c:program files(x86)msbuild14.0in中的msbuild.exe之后才能通过批处理文件生成解决方案。
如果您使用的是构建子脚本,请记住将路径更改为新的构建器:
设置cpath=c:program files(x86)msbuild14.0in
[重建,蝙蝠]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin call nuget_restore.bat "%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal if %errorlevel% neq 0 goto ERROR REM call deploy Release //Things like deploy files.. goto END :ERROR echo ERROR: %errorlevel% pause :END |