簡體   English   中英

如何避免將“可能的“空”分配給不可為空的實體”

[英]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 不能是 null SubObject 有時可以是 null

我有一個擴展方法

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

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

可能的“空”分配給不可為空的實體

如果我將第一行替換為

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

我擺脫了警告,但這是不正確的。 我怎樣才能說服 Resharper 這沒問題?...或者我錯了?

您可以添加括號:

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

如果 LHS 操作數為 null,null 鏈接 ( ?. ) 的作用是評估對 null 的整個成員訪問鏈,而不是僅評估對 null 的單個成員訪問。例如,考慮一長串成員訪問abc.def 如果只有a可以為 null,則您只需要編寫? 在這之后a安全的。 如果a是 null,它不只是a?.b計算為 null,因為在那種情況下你必須寫? 在每個成員訪問之后都是安全的,這有點煩人。

因此,如果沒有括號,整個成員訪問權限由於?. ,不管你最后叫什么。

通過添加括號,您打破了成員訪問鏈,因此myObj.SubObj?.CustomerList是可以為 null 的類型,並按預期方式調用EmptyIfNull - 返回EmptyIfNull應返回的任何類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM