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

Why Does .NET 4.6 Specific Code Compile When Targeting Older Versions of the Framework?

我有一个针对旧版本 .NET 框架 (.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 语言功能?

有 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 作为目标平台,上述代码将无法编译。

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

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

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

How can I ensure I'm only using .NET language features that work with the framework version I'm targeting?

如果您尝试使用 .NET 4.6 Framework 功能,并且您的目标是较早的框架,则会收到相应的编译器错误。

Would I be able to deploy this code to machine which did not have .NET 4.6?

是的,你会的。只要部署机器有一个框架与你在 VS2015 中的目标兼容。