我创建了一个示例项目,以c# 6.0的好东西- null传播和属性初始化为例,设置目标版本。net 4.0和它…的工作原理。

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使用clr4。没有任何关于。net 4.6的信息。

这是否意味着我可以在针对。net 4.0的软件中使用c# 6.0的特性?有什么限制或缺点吗?


当前回答

回答@oobe实际上是重要的。我只能在C:\Program Files (x86)\MSBuild\14.0\Bin.上使用MSBuild.exe后通过批处理文件构建我的解决方案。

其他回答

是的,你可以为旧的框架使用新的编译器,并获得新的编译器特性(只要这些特性不需要。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中引入的属性。

是的(大部分)。c# 6.0需要新的Roslyn编译器,但是新的编译器可以针对旧的框架版本进行编译。这仅限于不需要框架支持的新特性。

例如,虽然你可以在c# 6.0早期版本的.Net中使用字符串插值特性(因为它会导致对string. format的调用):

int i = 3;
string s = $"{i}";

你需要。net 4.6来使用IFormattable,因为只有新的框架版本添加了System。FormattableString:

int i = 3;
IFormattable s = $"{i}";

您提到的情况不需要框架中的类型来工作。所以编译器完全能够支持旧框架版本的这些特性。

回答@oobe实际上是重要的。我只能在C:\Program Files (x86)\MSBuild\14.0\Bin.上使用MSBuild.exe后通过批处理文件构建我的解决方案。

如果你正在使用构建属性,请记住将路径更改为new builder:

设置CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin

(Rebuild.bat)

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

只是想集中在如何理解维基百科和其他链接。

当维基百科说。net Framework 4.6附带了c# 6.0时,它只是意味着编译器的生产版本(msc.exe)将是。net Framework 4.6发布版的一部分。通过多目标,这样的编译器可以支持低版本的。net Framework。当然,自从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框架。