2012-01-23 1 views
6

Ho la seguente espressione, dove a.AnswerId è di tipo long?. ReSharper avverte di un possibile InvalidOperationException nella funzione di selezione. C'è mai un caso in cui ciò potrebbe effettivamente accadere? (Angolari casi vanno bene troppo)follow-up su avviso R #: possibile 'System.InvalidOperationException'

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

È possibile tenere traccia di quando questi problemi vengono risolti seguendo questi due problemi sul tracker dei problemi JetBrains: http://youtrack.jetbrains.net/issue/RSRP-213609 http://youtrack.jetbrains.net/issue/RSRP -200.225 – AakashM

risposta

7

Dal momento del check-in l'Where che a.AnswerId ha un valore, a.AnswerId.Value non potrà mai lanciare un InvalidOperationException (a meno che un altro thread sta cambiando i dati allo stesso tempo). Resharper ha capacità di analisi del codice piuttosto buone, ma non può individuare tutto, e in questo caso non si rende conto che lo Where rende sicuro chiamare .Value nel Select, quindi l'avviso. Quindi puoi tranquillamente ignorare questo avviso.

4

Sfortunatamente, ReSharper ha spesso dei falsi positivi. In questo caso, non ci sarà alcun problema finché lo AnswerId restituirà lo stesso valore nelle chiamate a Where e Select. (Assicurarsi che AnswerId non abbia un'implementazione pazzesca che restituisce un numero la prima volta che si accede e null la seconda volta.)

3

Sfortunatamente, ReSharper non è in grado di tracciare i controlli di condizione tramite la sequenza lambda di LINQ. Questo è un problema noto.