[英]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.