我创建了一个示例项目,使用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);
}
}
-
Wikipedia says C#6.0的.NET框架是4.6 .
-
This question(和Visual Studio 2015 CTP测试)说CLR版本是4.0.30319.0 .
-
This MSDN page表示.NET 4,4.5,4.5.2使用CLR 4.没有关于.NET 4.6的任何信息 .
这是否意味着我可以将C#6.0功能用于我的面向.NET 4.0的软件?有任何限制或缺点吗?
5 回答
是(大多数情况下) . C#6.0需要新的Roslyn编译器,但新编译器可以编译针对旧框架版本 . 这仅限于 don't require support from the framework 的新功能 .
例如,虽然您可以在C#6.0中使用早期版本的.Net中的字符串插值功能(因为它会调用
string.Format
):您需要.Net 4.6将其与
IFormattable
一起使用,因为只有新的框架版本添加System.FormattableString
:您提到的案例不需要框架中的类型才能工作 . 因此编译器完全能够支持旧框架版本的这些功能 .
只想关注如何理解维基百科和其他链接 .
当维基百科称C#6.0与.NET Framework 4.6一起使用时,它只是意味着编译器的 生产环境 版本(msc.exe)将成为.NET Framework 4.6版本的一部分 . 通过multi-targeting,此类编译器可以支持较低版本的.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页面尚未完全更新,但some page已在“版本信息”部分中列出了.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 if you do one small workaround中使用扩展方法(在C#3.0中引入)使编译器开心,以便它可以找到.NET 3.5中引入的属性 .
如果您正在使用构建脚本,请记住更改新构建器的路径:
set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
[Rebuild.bat]
@oobe的回答实际上是importatnt . 只有在使用 MSBuild.exe C:\Program Files (x86)\MSBuild\14.0\Bin 之后,我才可以通过批处理文件构建我的解决方案 .