今天编程时,出现了以下情况。泛型方法接受不可为空的泛型参数。该方法基本上只是将泛型值插入到集合中。但是,这会导致编译器警告,指示泛型参数可能为null。从表面上看,这似乎是编译器中的一个错误,与可为空的值的设计相矛盾。然而,我确信有一些我看不到的很好的解释。
考虑以下情况的简化示例:在l.Add(t)中,编译器警告t可能为public void M1<T>(T t, List<object> l) => l.Add(t);。
另外,为了完整起见,下面的方法给出了相同的错误(正如预期的那样):public void M1<T>(T? t, List<object> l) => l.Add(t);
有人对此有什么好的见解吗?
发布于 2021-06-11 18:11:53
有人可能会打来:
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,但仍然禁止t参数null值,那么:
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?>。
https://stackoverflow.com/questions/67935096
复制相似问题