C# 6.0 是否适用于 .NET 4.0?

Does C# 6.0 work for .NET 4.0?

我创建了一个示例项目,以 C#6.0 好东西 - 空值传播和属性初始化为例,设置目标版本 .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);
    }
}

这是否意味着我可以为面向 .NET 4.0 的软件使用 C# 6.0 功能?有什么限制或缺点吗?

是的,您可以将较新的编译器用于较旧的框架并获得新的编译器功能(只要这些功能不需要 .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 中引入)if you do one small workaround 让编译器满意,以便它可以找到在 .NET 3.5 中引入的属性.

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

例如,虽然您可以在早期版本的 .Net 中使用 C# 6.0 中的字符串插值功能(因为它会导致调用 string.Format):

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

您需要 .Net 4.6 才能将其与 IFormattable 一起使用,因为只有新框架版本添加了 System.FormattableString:

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

您提到的案例不需要框架中的类型即可工作。所以编译器完全有能力支持旧框架版本的这些特性。

只想关注如何理解维基百科和其他链接。

当维基百科说 C# 6.0 与 .NET Framework 4.6 一起使用时,它只是意味着编译器的生产版本 (msc.exe) 将成为 .NET Framework 4.6 版本的一部分。通过 multi-targeting,此类编译器可以支持较低版本的 .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 页面尚未完全更新,但some page版本信息部分中已列出 .NET Framework 4.6。

总的来说,语言规范(以及 C# 编译器)、CLR 规范和 .NET Framework 版本之间并没有紧密结合。它确实为开发人员提供了足够的灵活性,可以利用新的编译器来针对旧的 CLR 和 .NET Frameworks。

如果您正在使用构建脚本,请记住更改新构建器的路径:

set CPATH=C:\Program Files (x86)\MSBuild.0\Bin

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild.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

@oobe 的回答其实很重要。只有在使用 C:\Program Files (x86)\MSBuild.[= 中的 MSBuild.exe 后,我才能通过批处理文件构建解决方案17=].