如何避免获得 "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.
抱歉这个尴尬的例子,但我想尽可能切题
比方说,我已经解析了一个 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.