我有以下表达式,其中a.AnswerId
的类型为long?
。 ReSharper警告select函数中可能有InvalidOperationException
。有没有这种情况真的会发生? (角落也很好)
long[] ids = answers.Where(a => a.AnswerId.HasValue)
.Select(a => a.AnswerId.Value)
.ToArray();
答案 0 :(得分:7)
由于您检查Where
a.AnswerId
有值,a.AnswerId.Value
永远不会抛出InvalidOperationException
(除非另一个线程同时更改数据) 。 Resharper具有相当不错的代码分析功能,但它无法发现所有内容,在这种情况下,它没有意识到Where
可以安全地调用.Value
中的Select
,因此警告。所以你可以放心地忽略这个警告。
答案 1 :(得分:4)
不幸的是,ReSharper经常会出现误报。在这种情况下,只要AnswerId
在调用Where
和Select
时返回相同的值,就不会出现问题。 (确保AnswerId
没有一些疯狂的实现,在第一次访问时返回一个数字,第二次null
。{/ p>
答案 2 :(得分:3)
不幸的是,ReSharper无法通过LINQ lambdas序列跟踪条件检查。这是一个已知问题。