考虑以下在#nullable
上下文中使用 .Net Framework 4.8 编译的代码:
public sealed class Test<T>
{
public Test()
{
_data.Add(default); // warning CS8604: Possible null reference argument for parameter 'item' in 'void List<T>.Add(T item)'.
}
public T Item => _data[0];
readonly List<T> _data = new List<T>();
}
此代码会引起警告CS8604,如注释所示。
在没有约束T?
为T
的情况下使用class
来修复代码是 的可能性:
public sealed class Test<T>
{
public Test()
{
_data.Add(default);
}
public T? Item => _data[0]; // error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type
readonly List<T?> _data = new List<T?>(); // error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type
}
我无法添加“结构”或“类”类型的约束,因为此代码实际上位于PriorityQueue<T>
类中,该类已经在很多地方使用了值和引用类型。
所以我现在要做的只是像这样抑制消息:
public Test()
{
_data.Add(default!); // Note the "!"
}
这是处理此问题的正确方法吗(假设它必须与.Net Framework 4.8配合使用,因此新的与空相关的代码注释不可用)?