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


275

我创建了一个带有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);
    }
}

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


7
.Net版本2.0-3.5使用CLR v2.0。较新的版本使用CLR v4.0。
i3arnon 2015年

请记住,明智地优化:您正在像这样为每只猫添加单独的if-null-check
Terence 2016年

2
我的天啊。我一直在开发针对v4.6的WCF,只是要“提醒”生产服务器要到2018年才升级。我认为一个月的工作量需要几天的重构。五分钟内完成。谢谢Microsoft!:D
Eric Wu

Answers:


286

是的(大部分)。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}";

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


31
实际上,您不需要.Net 4.6,只需添加其中的几种类型。您可以自己将它们添加到较旧的框架中。这段代码可以在.Net 4.0和3.5上正常工作。
2015年

10
是否有列表可以查看.NET 4.0中哪些C#6功能起作用?提出这种问题的另一种方式是:哪些新功能需要框架的支持,哪些不需要?
Rubenisme 2015年

1
@Rubenisme除了IFormattable字符串插值,我想不出另一个。
i3arnon 2015年

2
我猜我们可以说所有语法糖都可以使用并针对较旧的框架版本。可以这样说吗?
mkb

4
@mkb是的。语法糖正是那些仅依赖于编译器功能而不是框架功能的功能。
i3arnon

52

只想着重于如何理解维基百科和其他链接。

维基百科说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 Framework。


29

是的,您可以将较新的编译器用于较旧的框架,并可以访问新的编译器功能(只要这些功能不需要.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中引入的属性。


1

如果您正在使用构建脚本,请记住将路径更改为新构建器:

设置CPATH = C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END

1

@oobe的回答实际上很重要。仅在从C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin使用MSBuild.exe之后,我才能通过批处理文件构建解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.