【发布时间】:2020-11-23 22:53:51
【问题描述】:
如果我构建和发布语言版本为 9 的 NuGet 包,我可以在使用较低语言版本(例如 c# 7)的项目中安装和引用 NuGet 包吗?
NuGet 包 .csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>9</LangVersion>
</PropertyGroup>
</Project>
消费库.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
</Project>
【问题讨论】:
-
你为什么不试试看呢? (附注:我希望是的,因为当你构建一个 C# 程序时,它会被编译成 IL。所以原始 C# 永远不会靠近目标项目。AFAIK C# 版本只决定了你在编码时可以使用哪些语言功能以及什么编译器您需要的版本。它编译到的内容取决于目标 .NET Framework。请记住,当您安装 nuget 包(或任何引用任何其他 .NET DLL)时,您甚至都不知道如果它最初是用 C# 或其他语言编写的 - 这是 .NET 的优点之一)
-
正式地,语言版本现在绑定到目标框架版本(虽然你可以用
LangVersion覆盖它,正式地你在不受支持的条件下)。在实践中,只要您不使用依赖于较新目标框架的 C# 功能(您需要跳过箍并使用 polyfill 来执行此操作,例如定义System.Runtime.CompilerServices.IsExternalInit以使用仅初始化属性),您将没事。 -
@canton7 甚至像 init-only 访问器这样的东西也会考虑到旧的编译器;这就是 为什么 它使用 mod-req;需要注意的是,您根本无法使用该属性,即使在初始化程序中也是如此。不过,不涉及该属性的东西应该没问题。
-
@MarcGravell 是的,我想说的是,如果您使用 polyfill 来使用较新编译器引入的功能来定义类型/方法,则不一定希望旧编译器能够能够以与新编译器相同的方式使用这些类型/方法。
标签: c# nuget nuget-package .net-standard csproj