C#6.0是否适用于.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);
    }
}
  • 维基百科说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的任何信息。
  • 这是否意味着我可以将C#6.0功能用于定位.NET 4.0的软件? 是否有任何限制或缺点?


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

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

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

    因为只有新的框架版本添加System.FormattableString所以需要.Net 4.6才能将其与IFormattable结合使用:

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

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


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

    当维基百科说C#6.0与.NET Framework 4.6一起使用时,它仅仅意味着编译器的生产版本(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 Framework版本并不紧密地相互耦合。 它确实为开发人员提供了足够的灵活性来利用新的编译器来定位较旧的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中引入的属性。

    链接地址: http://www.djcxy.com/p/53699.html

    上一篇: Does C# 6.0 work for .NET 4.0?

    下一篇: WinForms temporary disable vertical scrollbar in panel