C 6.0适用于.NET 4.0吗?

Does C# 6.0 work for .NET 4.0?

我创建了一个示例项目,以C 6.0 Goodies-空传播和属性初始化为例,设置目标版本.NET 4.0,它…作品。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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使用clr 4。没有关于.NET 4.6的任何信息。

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


是的(大部分)。C 6.0需要新的Roslyn编译器,但是新的编译器可以针对旧的框架版本进行编译。这仅限于不需要框架支持的新功能。

例如,虽然您可以将C_6.0中的字符串插值功能与早期版本的.NET一起使用(因为它会导致对string.Format的调用):

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

您需要.NET 4.6与IFormattable一起使用,因为只有新的框架版本添加了System.FormattableString

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

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


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

当维基百科说C 6.0与.NET Framework 4.6结合使用时,它仅仅意味着编译器的生产版本(msc.exe)将成为.NET Framework 4.6版本的一部分。通过多目标,这样的编译器可以支持更低版本的.NET框架版本。当然,自从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框架。


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


@oobe的回答实际上很重要。我只能在使用c:program files(x86)msbuild14.0in中的msbuild.exe之后才能通过批处理文件生成解决方案。


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

设置cpath=c:program files(x86)msbuild14.0in

[重建,蝙蝠]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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