2012-01-23 25 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序列跟踪条件检查。这是一个已知的问题。