2012-01-23 64 views
6

我有以下表達式,其中a.AnswerId類型long?。 ReSharper在選擇功能中警告可能的InvalidOperationException。有沒有發生過這種情況? (角案件也沒關係)R#警告後續:可能'System.InvalidOperationException'

long[] ids = answers.Where(a => a.AnswerId.HasValue) 
        .Select(a => a.AnswerId.Value) 
        .ToArray(); 
+0

您可以通過在JetBrains問題跟蹤器上關注這兩個問題來跟蹤這些問題的解決時間:http://youtrack.jetbrains.net/issue/RSRP-213609 http://youtrack.jetbrains.net/issue/RSRP -200225 – AakashM

回答

7

既然你在Wherea.AnswerId有一個值檢查,a.AnswerId.Value永遠不會拋出InvalidOperationException(除非另一個線程在同一時間改變數據)。 Resharper具有非常好的代碼分析功能,但它無法識別所有內容,在這種情況下,它不知道Where使中的.Value變得安全,因此是警告。所以你可以放心地忽略這個警告。

4

不幸的是,ReSharper經常出現誤報。在這種情況下,只要AnswerId在調用WhereSelect時返回相同的值就不會有問題。 (請確保AnswerId沒有一些瘋狂的實現,第一次訪問它時返回一個數字,第二次返回null。)

3

不幸的是,ReSharper無法通過LINQ lambdas序列跟蹤條件檢查。這是一個已知的問題。