我创建了一个示例项目,以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.6。
这个问题(和Visual Studio 2015 CTP测试)说CLR版本是4.0.30319.0。
这个MSDN页面说。net 4, 4.5, 4.5.2使用clr4。没有任何关于。net 4.6的信息。
这是否意味着我可以在针对。net 4.0的软件中使用c# 6.0的特性?有什么限制或缺点吗?
是的(大部分)。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}";
您提到的情况不需要框架中的类型来工作。所以编译器完全能够支持旧框架版本的这些特性。
只是想集中在如何理解维基百科和其他链接。
当维基百科说。net Framework 4.6附带了c# 6.0时,它只是意味着编译器的生产版本(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框架的发布并不是紧密耦合的。它确实为开发人员提供了足够的灵活性,可以利用新的编译器来针对旧的clr和. net框架。