避免“可以为 null 的值类型可能为 null”警告

Avoid "Nullable value type may be null" warning

提问人:Brad 提问时间:3/2/2023 最后编辑:Patrick McDonaldBrad 更新时间:3/3/2023 访问量:630

问:

我在 lambda 中收到警告,但之前的语句是这样,不,值类型不能为 null。如何告诉 Visual Studio 不要标记这些误报?Nullable value type may be null.Where(o => o.HasValue)

例如:

var list = new List<int?> { 1, 2, null, 3 };
var query = list
    .Where(o => o.HasValue)
    .Select(o => o.Value);
C# 可视化工作室

评论

0赞 Tu deschizi eu inchid 3/2/2023
以下内容可能会有所帮助: 可以为 null 的引用类型(C# 参考)
0赞 David 3/2/2023
您可以禁止显示警告,尽管我个人认为仅执行您链接的页面建议并使用 null 合并运算符来提供合理的默认值的侵入性较小,即使该默认值永远不会在运行时逻辑上使用。或者可能是 null-forgiving 运算符(也由您链接的页面建议)。
0赞 Patrick McDonald 3/2/2023
您可以使用链接的 null 宽恕运算符:.Where(o => o.HasValue).Select(o => o!.Value)
0赞 Brad 3/3/2023
@David 存在的原因是在执行其他工作之前过滤掉非空值,因此建议以第二种方式解决空值似乎具有误导性。.Where(o => o.HasValue)
0赞 Brad 3/3/2023
null 宽容运算符似乎有效,但感觉很笨拙。比如,VS 应该能够弄清楚该警告不可能与它放置警告的位置相关。如果我必须负责添加.!

答:

3赞 CodeCaster 3/3/2023 #1

编译器不会执行 Linq 表达式。

对它是不透明的,您在传递给的表达式中编写的任何内容都不会更改 的返回值,因此您仍然在 .Where()Where()Where()Select()IEnumerable<int?>

你也可以写 or ,它不会改变进入或离开它的集合的类型Where(o => true)Where(o => false)

解决方案是告诉编译器知道值不再为 null 的位置:

.Select(o => o!.Value);

之后只是告诉编译器:“相信我,我知道这里不是空的”。!oo

评论

0赞 Brad 3/3/2023
一个不幸的妥协,但它有效。在 C# 和 Typescript 之间来回切换,似乎 Typescript 会解决这个问题。