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

本文关键字:框架 版本 编译 net 代码 为什么 | 更新日期: 2023-09-27 18:04:00

我有一个项目,目标是老版本的。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语言功能,与框架版本工作,我的目标?

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

. net框架版本和c#语言版本是不同的东西。c# 6语言特性

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

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

我如何确保我只使用。net语言功能,与框架版本工作,我的目标?

如果你试图使用。net 4.6框架特性,如果你的目标是一个更早的框架,你会得到一个适当的编译器错误。

我能把这段代码部署到没有。net 4.6的机器上吗?

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

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