我创建了一个示例项目,使用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)
您提到的案例不需要框架中的类型才能工作.因此编译器完全能够支持旧框架版本的这些功能.
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中引入的属性.