C#6.0适用于.NET 4.0吗?

我创建了一个示例项目,使用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.0的软件?有任何限制或缺点吗?

回答(5)

3 years ago

是(大多数情况下) . C#6.0需要新的Roslyn编译器,但新编译器可以编译针对旧框架版本 . 这仅限于 don't require support from the framework 的新功能 .

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

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

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

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

您提到的案例不需要框架中的类型才能工作 . 因此编译器完全能够支持旧框架版本的这些功能 .

3 years ago

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

当维基百科称C#6.0与.NET Framework 4.6一起使用时,它只是意味着编译器的 生产环境 版本(msc.exe)将成为.NET Framework 4.6版本的一部分 . 通过multi-targeting,此类编译器可以支持较低版本的.NET Framework版本 . 当然,由于Roslyn成为一个开源项目,编译器现在完全是一个单独的组件 .

当某些东西引用CLR版本4.0.30319(.0)时,它实际上可以是.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框架 .

3 years ago

是的,您可以为较旧的框架使用较新的编译器并访问新的编译器功能(只要这些功能不需要.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 if you do one small workaround中使用扩展方法(在C#3.0中引入)使编译器开心,以便它可以找到.NET 3.5中引入的属性 .

3 years ago

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

set 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

3 years ago

@oobe的回答实际上是importatnt . 只有在使用 MSBuild.exe C:\Program Files (x86)\MSBuild\14.0\Bin 之后,我才可以通过批处理文件构建我的解决方案 .