如何解决具有不可为空泛型参数的 C# 泛型方法警告可能的空引用
今天编程时出现了以下情况。 泛型方法接受不可为空的泛型参数。该方法基本上只是将泛型值插入到集合中。但是,这会引起编译器警告,指示泛型参数可能为空。从表面上看,它似乎是编译器中的一个错误,并且与可空值的设计相矛盾。但是,我确信有一些我没有看到的很好的解释。
考虑以下情况的简化示例:
public void M1<T>(T t,List<object> l) => l.Add(t);
编译器警告 l.Add(t)
中的 t 可能为空。
也只是为了完整性,以下方法给出了相同的错误(如预期):
public void M1<T>(T? t,List<object> l) => l.Add(t);
有人对此有很好的见解吗?
解决方法
有人可以打电话:
var list = new List<object>();
M1<string?>(null,list);
现在您的列表应该只包含不可为空的对象,包含 null
。因此发出警告。
如果您想防止 T
成为可空类型,则:
public void M1<T>(T t,List<object> l) where T : notnull
{
...
}
这会给你警告:
M1<string?>(null,new List<object>());
^^^^^^^^^^^
// warning CS8714: The type 'string?' cannot be used as type parameter 'T' in the generic
// type or method 'C.M1<T>(T,List<object>)'. Nullability of type argument 'string?' doesn't
// match 'notnull' constraint.
如果您想让 T
为 null
,但仍禁止该 null
参数的 t
值,则:
public void M1<T>([DisallowNull] T t,List<object> l)
{
...
}
这会给你警告:
M1<string?>(null,new List<object>());
^^^^
// warning CS8625: Cannot convert null literal to non-nullable reference type.
当然,如果您想允许 null
,那么您的 l
必须是 List<object?>
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。