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

我有一个针对旧版.NET Framework(.NET 4.5.2)的项目。 我安装了Visual Studio 2015(因此我的机器上安装了.NET 4.6)。 我注意到如果我使用.NET 4.6 / C#6中发布的C#语言function,它仍会编译。 如果我的项目的目标框架是<.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语言function?

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

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

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

我如何确保我只使用与我所针对的框架版本一起使用的.NET语言function?

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

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

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

有C#6function和.NET 4.6function。

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

需要.NET 4.6的function示例如下:

 public void Foo(IReadOnlyCollection input) { } public void Main(string[] args) { Foo(new Stack()); } 

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