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

我创build了一个示例项目,以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 CTPtesting)说CLR版本是4.0.30319.0。
  • 这个MSDN页面说.NET 4,4.5,4.5.2使用CLR 4.没有关于.NET 4.6的任何信息。

这是否意味着我可以使用针对.NET 4.0的软件的C#6.0function? 有什么限制或缺点?

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

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

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

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

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

你提到的情况不需要框架中的types来工作。 所以编译器完全能够支持旧版本的这些function。

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

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

是的,您可以使用较新的编译器来处理较旧的框架,并可以访问新的编译器function(只要这些function不需要.NET 4.6中引入的新types)。

其他的例子是带有默认参数的方法被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中引入), 如果您执行一个小的解决方法以使编译器很高兴,以便可以find.NET 3.5中引入的属性。