2017-08-01 31 views
4

我試圖使用新的C#7的模式匹配功能,在這行代碼在收到警告「該人士表達模式的類型的始終,對所有非空值相符」

if (Customers.SingleOrDefault(x => x.Type == CustomerType.Company) is Customer customer) 
{ 
    ... 
} 

但對於一些原因ReSharper的/ Visual Studio的2017年是給我一個警告is Customer下,出現以下消息

源表達模式的類型的始終,對所有 非空值相匹配

但是customer也可以是null對不對?任何人都可以向我解釋爲什麼會發出此警告?

+0

你想達到什麼目的? –

+0

雖然沒有更好的方法來編寫這個表達式來檢查非空值,但ReSharper告訴你,如果你已經知道每個元素都是一個Customer,你爲什麼明確地要求它檢查它是否是一個客戶?它基本上說「這看起來很腥」。它不會說「這是錯誤的」。說實話,我認爲ReSharper是對的。如果我看到「Customers」是「Customer」的集合,我也會對這個表達式感到疑惑。只是明確地檢查內部的非空內容會更加清楚。 –

+1

我會同意這是來自R#的一個愚蠢的警告。 「...匹配所有非空值」正是你在這裏想要的,所以R#沒有任何意義可以警告你,你的代碼將按照你想要的方式工作。我建議在[ReSharper問題跟蹤器](https://confluence.jetbrains.com/display/ReSharper/ReSharper+Issue+Tracker)上提出這個問題。 –

回答

3

你是對的!

ReSharper(而不是Visual Studio)事實上是正確的,但我不知道爲什麼這將是一個警告。

雖然CustomersCustomer集合,使用SingleOrDefault提示該值可能是null這不是Customer

而且沒有任何說明來自Customers的所有值都不是null

+2

另一方面,這是一個令人費解的非空檢查,這可能是爲什麼ReSharper警告它。 –

+3

爲什麼令人費解?我讀到的方式是「給我這個顧客......如果存在的話,把它放在顧客變量中」。 –

相關問題