我目前正在尝试将新的C# 8.0非空引用类型特性应用于现有代码,并且不知道如何修复以下数据反序列化方法中的CS8603警告:
T ReadOptional<T>() where T : IEntity, new()
{
if (ReadBoolean())
{
T instance = new T();
instance.Read(this); // IEntity method
return instance;
}
else
{
// CS8603 Possible null reference return.
return default;
}
}
如您所见,如果前面的布尔值为假,则该方法可能返回
null
(类)/ default
(结构体),否则它将返回一个实现IEntity
的任何内容的T
实例。但是,我无法将返回类型标记为
T?
,因为如果T
是一个结构体,它实际上不会返回null
,这正如编译器错误CS8627所正确抱怨的那样。// CS8627: A nullable type parameter must be known to be a value type or non-nullable
// reference type. Consider adding a 'class', 'struct', or type constraint.
T? ReadOptional<T>() where T : IEntity, new()
- 我不能通过确保
T
具有class
约束来修复此问题,因为我还希望struct
实例能够使用此方法(返回default
)。 - 我不能创建一个
T
具有struct
约束的重载,因为约束不能是唯一不同的重载。 - 我可以创建不同名称的方法,但这将破坏库接口,并且会影响太多依赖于它的代码。
是否有语法可以修复非空警告,而不会破坏针对结构体返回 default
实例的可能性?
<T>
传递,并且ReadBoolean
返回false
,您会期望发生什么? - Lasse V. Karlsen