为什么.NET 4.6特定代码在针对框架的旧版本时编译?

时间:2015-07-22 17:59:43

标签: c# .net visual-studio-2015 c#-6.0 .net-4.6

我有一个针对旧版.NET Framework(.NET 4.5.2)的项目。我安装了Visual Studio 2015(因此我的机器上安装了.NET 4.6)。我注意到如果我使用.NET 4.6 / C#6中发布的C#语言功能,它仍会编译。如果我的项目的目标框架是< .NET 4.6,不应该编译:

    public string MyExpressionBodyProperty => "1";

    //auto properties are new in C# 6
    public string MyAutoProperty { get; } = "1";

    private static void MethodThatUsesNameOf(string filename)
    {
        if (filename == null) 
        {
            //nameof was released in C# 6
            throw new ArgumentException("The file does not exist.", nameof(filename));
        }
    }

如何确保我只使用与我定位的框架版本兼容的.NET语言功能?

2 个答案:

答案 0 :(得分:20)

.NET Framework版本和C#语言版本是不同的东西。 C#6语言功能

public string MyAutoProperty { get; } = "1";
nameof(filename)

可以由VS 2015编译为针对早期框架的代码。

  

如何确保我只使用与我定位的框架版本兼容的.NET语言功能?

如果您尝试使用.NET 4.6 Framework功能,如果您的目标是早期框架,则会出现相应的编译器错误。

  

我是否可以将此代码部署到没有.NET 4.6的计算机上?

是的,你愿意。只要部署机器具有与您在VS2015中定位的框架兼容的框架。

答案 1 :(得分:12)

有C#6功能和.NET 4.6功能。

nameof是一个C#6功能,因此只需要在较新的编译器上运行,但仍然可以使用较旧的.NET框架。

需要.NET 4.6的功能示例如下:

public void Foo(IReadOnlyCollection<string> input)
{
}

public void Main(string[] args)
{
    Foo(new Stack<string>());
}

在.NET 4.6中Stack实现了IReadOnlyCollection,但在之前的版本中却没有。如果您选择.NET 4.5.2作为目标平台,则上述代码将无法编译。