首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不可为空的泛型参数的C#泛型方法警告可能的空引用

具有不可为空的泛型参数的C#泛型方法警告可能的空引用
EN

Stack Overflow用户
提问于 2021-06-11 18:09:07
回答 1查看 92关注 0票数 2

今天编程时,出现了以下情况。泛型方法接受不可为空的泛型参数。该方法基本上只是将泛型值插入到集合中。但是,这会导致编译器警告,指示泛型参数可能为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);

有人对此有什么好的见解吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-11 18:11:53

有人可能会打来:

代码语言:javascript
复制
var list = new List<object>();
M1<string?>(null, list);

现在,应该只包含不可为空的对象的列表包含了null。因此出现了警告。

如果要防止T成为可为空的类型,则:

代码语言:javascript
复制
public void M1<T>(T t, List<object> l) where T : notnull
{
    ...
}

这将向您显示以下警告:

代码语言:javascript
复制
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值,那么:

代码语言:javascript
复制
public void M1<T>([DisallowNull] T t, List<object> l)
{
    ...
}

这将向您显示以下警告:

代码语言:javascript
复制
M1<string?>(null, new List<object>());
            ^^^^
// warning CS8625: Cannot convert null literal to non-nullable reference type.

当然,如果你想允许null,那么你的l必须是一个List<object?>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67935096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档