2015-11-10 54 views
0

此代碼工作正常:聯合空和值檢查

policy.ProviderID > 0 ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null 

但ReSharper的是抱怨policy.ProviderID.Value需求是null檢查(以防止InvalidOperationException)。

據我所知,該條件只對大於0的非空值計算爲真,因此不需要進一步檢查。

我應該將此記錄爲JetBrains的錯誤嗎? 或者我誤解了一些東西。

+1

什麼是policy.ProviderID的類型? – Matt

+0

@Matt顯然'int?' –

+1

@IvanStoev,你是如何得出這個結論的?我看不出任何東西來確認它是那種類型。 –

回答

6

我懷疑R#抱怨,因爲它不知道policy.ProviderID將在兩次評估中返回相同的值。試想一下:

private readonly int? providerId; 

public int? EvilProviderId => DateTime.UtcNow.Second == 0 ? null : providerId; 

現在考慮您的編碼 - 條件因爲第一個電話是在第二執行59 ...但隨後的時鐘的第二個電話,然後就返回null之前蜱,導致可能是真的一個NullReferenceException

如果爲什麼R#爲抱怨,只是提取一個局部變量:

int? providerId = policy.ProviderId; 
// Use providerId in both cases in your expression 
+0

我在本地獲得相同的行爲。但是,將其更改爲'var t = p.ProviderID.HasValue? (int?)p.ProviderID.Value:null;'刪除警告,但仍然容易受到你所描述的情況的影響。這可能是由於R#沒有區分'int?'和其他'Nullable ',其中'T'可能會導致運算符超載。有趣的是, – Rob

+0

此外,您解決提取本地變量確實也會刪除警告。 – Rob

+0

我隱約想到,但如果用「!= null」取代(或補充)「> 0」檢查,那麼Resharper會刪除警告,所以我認爲它一定是別的。 –

0

使用這個代替:

(policy != null && policy.ProviderID.HasValue && policy.ProviderID. Value > 0) ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null 
+0

Whaw,還有那些讓ReSharper開心的事情?如果屬性在調用之間沒有變異,那麼OP代碼是完全正確的,但是如果這樣做,您的代碼片段也將不起作用。 –

+0

對不起,downvote不需要...我試圖幫助.. –