繁体   English   中英

解决多个标准框架的 NuGet 包 - 可空值问题

[英]NuGet package addressing multiple Standard frameworks - problem with nullables

我们有一系列 .Net Core 3.1 应用程序。 我们将通用代码抽象为 .NetStandard 2.1 NuGet 包,并在我们的私有 NuGet 服务器上提供这些代码。

这就是这些 NuGet 包的成功之处,我们被要求将它们提供给我们使用 .Net Framework 4.8 编写的其他应用程序。

我们遵循了 Microsoft 给出的建议( 在您的项目文件中支持多个 .NET Framework 版本),这对于除我们的一个包之外的所有包都很好。...

那么 - 这个有什么不同?

此包使用可空值。 我可以让项目编译得很好,但抛出异常的是测试项目 (.NetCore 3.1)。 我将首先查看我们在 Standard 项目中所做的代码更改,然后查看 Test 项目 - 希望有人会发现我们出错的地方。

.Net 标准项目

.csproj 文件

改变了

<TargetFramework>netstandard2.1</TargetFramework>

<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>

还移动了<Nullable>enable</Nullable>到它自己的部分

  <PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2_1' ">
    <Nullable>enable</Nullable>
  </PropertyGroup>

班上

然后我们有一个类文件。 我不会费心展示基类,但它遵循类似的模式:

public class MyClass<T> : MyBaseClass
        where T : struct
{
    public MyClass()
        : this(default)
    {
    }

#if netstandard2_1
    public MyClass(T? item)
        : base(true, 0, null)
    {
        this.Item = item;
    }
#else
    public MyClass(T item)
        : base(true, 0, null)
    {
        this.Item = item;
    }
#endif

#if netstandard2_1
    public T? Item { get; set; }
#else
    public T Item { get; set; }
#endif
}

这将编译并在 bin/release 文件夹(或 bin/debug)中看到两个文件夹,一个用于netstandard2.1 ,另一个用于netstandard2.0 ,每个文件夹中都有预期的 DLL。

但是,使用 ILSPY 检查这两个 DLL 中的此类表明它们是相同的......不是一个可以看到的问号。 不确定这是 ILSPY 的人工制品还是真实的....

测试项目

因此,测试项目具有对标准项目的项目引用(因此,它不是对 NuGet 包的引用)。

在其中一项测试中,我有:

Guid? g = null;
var actual = new ItemValueOperationResponse<Guid>(g);

这导致以下错误:

CS1503 参数 1:无法从“System.Guid”转换? 到“System.Guid”

但是,这个测试项目是.Net Core 3.1,所以它应该使用Standard2.1代码。

我尝试交换 *.csproj 中的序列,使其读取为<TargetFrameworks>netstandard2.1;netstandard2.0</TargetFrameworks>但无济于事。

还尝试使用大写: #if NETSTANDARD2_1

最终在我们的测试项目中有区域。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM