gpt4 book ai didi

c# - 如何避免获得 "possible "null“分配给不可为 null 的实体”

转载 作者:行者123 更新时间:2023-12-05 01:53:06 30 4
gpt4 key购买 nike

对不起,这个尴尬的例子,但我想尽可能切题

比方说,我已经解析了一个 json 文件,它给出了下面的层次结构

var customers = myObj.SubObj?.CustomerList.EmptyIfNull();
var plusCustomers = customers.Where(...) // Resharper warning

myobj 不能为空SubObject 有时可以为 null

我有一个扩展方法

IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> enumerable) => enumerable ?? Enumerable.Empty<T>();

所以我希望 plusCustomers 行是安全的(空列表而不是 null)。但是我收到警告

possible "null"assignment to a non-nullable entity

如果我将第一行替换为

var customers = myObj.SubObj.CustomerList.EmptyIfNull();

我摆脱了警告,但这是不正确的。我怎样才能让 Resharper 相信这是可以的?...或者我错了?

最佳答案

您可以添加括号:

(myObj.SubObj?.CustomerList).EmptyIfNull();

空链接 (?.) 的作用是评估成员访问空的整个链,如果 LHS 操作数为空,而不是仅评估该单个成员访问 null。例如,考虑一长串成员访问 a.b.c.d.e.f。如果只有 a 可以为 null,则您只需在 a 之后编写 ? 即可确保安全。如果 a 为 null,它不会将 a?.b 评估为 null,因为在那种情况下,您必须在之后编写 ?每个成员的访问都是安全的,这有点烦人。

因此,如果没有方括号,由于 ?.,整个成员访问权限都可以为 null,无论您在末尾调用什么。

通过添加括号,您打破了成员访问链,因此 myObj.SubObj?.CustomerList 是可空类型,调用 EmptyIfNull 就可以了正如预期的那样 - 返回任何类型 EmptyIfNull 应该返回。

关于c# - 如何避免获得 "possible "null“分配给不可为 null 的实体”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71233197/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com