使用 .NET 5.0 中的类型,同时保持与早期 .NET 版本(如 .NET Core 3.1)的兼容

Use types from .NET 5.0 while remaining compatible with earlier .NET versions like .NET Core 3.1

假设您想要使用 the new System.Half,但您还希望 .NET Core 3.1 应用程序(或更早版本)使用您的库。我可以简单地复制 System.Half 实现并丢失旧 .NET 版本的内在优化行为,但我可以在单个程序集中这样做吗?

据我所知这是不可能的(除非反射式方法,或首次使用时发出 IL 的疯狂行为):上述情况需要使用构建为 .NET 5.0 单独构建-in System.Half) 和旧的 .NET 版本(使用我们的内部 System.Half)。

但我希望是否有某种方法可以 compile/configure 具有某种创意类型转发的单个程序集在可用时使用给定类型的 .NET 5.0 版本,否则使用垫片。

(这个问题与语言无关,并不特定于 System.Half

通常,它归结为:是否有可用的 nuget 包提供 API 的某些部分?请注意,对于像 Half 这样原始的东西,即使有 nuget 包,它的实现也可能不同——即没有内置的 JIT/intrinsic 支持——但它可能仍然有效。例如,考虑 Span<T> 在 down-level 框架中工作 (通过 nuget),但在 中工作最好 .NET 核心 3.1 或更高版本。作为另一个示例,请考虑 IAsyncDisposable/IAsyncEnumerable<T>,它们可通过 nuget 包获得。

简而言之:不,在 单个程序集 中是不可能的 - 这需要 multi-targeting 你的库 5.0+ 和最低版本来完成您想要支持的 .NET CCore 并创建此库的 NuGet 包。

使用该库的应用程序将 select 最匹配的程序集,因此 .NET 5/6/+ 应用程序将使用运行时的 System.Half 实现和 .NET Core 获取您的 .NET 5.0 切片3.1 应用程序将获得另一个切片,其中包含您放在 #if.

后面的 System.Half 的实现

即使您不想 multi-target 您的库,也需要一个不同的 NuGet 包来为 .NET (Core) < 5.0 提供包含 System.Half 实现的片段。然后,您的图书馆将依赖此包,导致消费者可传递地使用此包。