关于c#:为什么.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,那么这不应该编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
    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语言功能?


.NET框架版本和C语言版本是不同的。C 6语言功能

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

可以通过vs 2015编译成针对早期框架的代码。

0

如果您尝试使用.NET 4.6框架功能,那么如果您以较早的框架为目标,则会得到适当的编译器错误。

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

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


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

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

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

1
2
3
4
5
6
7
8
public void Foo(IReadOnlyCollection<string> input)
{
}

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

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