如何避免获得 "possible "null"assignment to a non-nullable entity"

How to avoid getting "possible "null"assignment to a non-nullable entity"

抱歉这个尴尬的例子,但我想尽可能切题

比方说,我已经解析了一个 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 按预期工作 - returning什么类型 EmptyIfNull 应该 return.