C#6.0适用于.NET 4.0吗?

时间:2015-03-08 00:22:28

标签: c# .net c#-6.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 个答案:

答案 0 :(得分:280)

是(大多数情况下)。 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}";

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

答案 1 :(得分:51)

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

当维基百科说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框架。

答案 2 :(得分:28)

是的,您可以为较旧的框架使用较新的编译器并访问新的编译器功能(只要这些功能不需要.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中引入的属性。 / p>

答案 3 :(得分:1)

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

设置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

答案 4 :(得分:1)

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