繁体   English   中英

C# 具有不可为空的泛型参数的泛型方法警告可能的 null 参考

[英]C# Generic Method with non-nullable generic parameter warns of possible null reference

今天在编程时出现了以下情况。 泛型方法接受不可为空的泛型参数。 该方法基本上只是将通用值插入到集合中。 但是,这会引发编译器警告,指出泛型参数可能是 null。 从表面上看,这似乎是编译器中的一个错误,并且与可空值的设计相矛盾。 但是,我确信有一些我没有看到的很好的解释。

考虑以下情况的简化示例: public void M1<T>(T t, List<object> l) => l.Add(t); 编译器警告 t 可能是l.Add(t)中的 null 。

也只是为了完整性,以下方法给出了相同的错误(如预期的那样): 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.

如果您想让Tnull ,但仍禁止该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?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM