【问题标题】:Can a NuGet package built with a newer version of c# be used in a project using an older version of c#?可以在使用旧版本 c# 的项目中使用使用较新版本 c# 构建的 NuGet 包吗?
【发布时间】: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


【解决方案1】:

这是可能的。

因此,在@ADyson 的建议下,我尝试自己在本地执行此操作。

我花了大约 30 分钟来构建一个 .netstandard2.0 项目,并使用 Microsoft.Bcl.AsyncInterfaces 5.0.0 NuGet 包引用 IAsyncEnumerable,因为它本身不包含在内在.netstardard2.0

在本地打包 NuGet 后,我​​使用 .netcore2.1 将其包含到控制台应用程序中,并调用使用 IAsyncEnumerable 的方法。成功了!

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2019-02-18
    • 2015-08-02
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多