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

wha*_*vAR 9 .net c# c#-6.0 visual-studio-2015 .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));
        }
    }
Run Code Online (Sandbox Code Playgroud)

我怎样才能确保我只使用与我所针对的框架版本一起使用的.NET语言功能?

Eri*_* J. 20

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

public string MyAutoProperty { get; } = "1";
nameof(filename)
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能确保我只使用与我所针对的框架版本一起使用的.NET语言功能?

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

我能将此代码部署到没有.NET 4.6的机器上吗?

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

  • 另一个选择是在Project Properties - Build - Advanced下更改为C#version 5. (2认同)

Guv*_*nte 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>());
}
Run Code Online (Sandbox Code Playgroud)

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