C#6.0适用于.NET 4.0吗?

Maj*_*cRa 271 .net c# 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着我可以将C#6.0功能用于我的面向.NET 4.0的软件?有任何限制或缺点吗?

i3a*_*non 283

是(大多数情况下).C#6.0需要新的Roslyn编译器,但新编译器可以编译针对旧框架版本.这仅限于不需要框架支持的新功能.

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

int i = 3;
string s = $"{i}";
Run Code Online (Sandbox Code Playgroud)

您需要.Net 4.6才能使用它,IFormattable因为只有新的框架版本添加System.FormattableString:

int i = 3;
IFormattable s = $"{i}";
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,您不需要.Net 4.6,只需添加几种类型.您可以自己将它们添加到旧框架中.[此代码在.Net 4.0和3.5上运行良好.](https://gist.github.com/svick/e5b30f73146a501cc64f) (30认同)
  • 是否有一个列表可以查看哪些C#6功能在.NET 4.0中有效?另一种询问方式是:哪些新功能需要框架支持哪些功能不支持? (10认同)
  • @mkb是的.语法糖正是那些仅依靠编译器的能力,而不是那些框架的功能. (4认同)
  • 我想我们可以说所有的语法糖都可以使用并针对较旧的框架版本.可以这么说吗? (2认同)

Lex*_* Li 51

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

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

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


Sco*_*ain 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中使用扩展方法(在C#3.0中引入),这样它就可以找到.NET 3.5中引入的属性.