ReSharper - 在 Any 之后可能 'System.NullReferenceException'

ReSharper - Possible 'System.NullReferenceException' after Any

我使用的是 ReSharper Ultimate 2016.2,但我在以前的版本中也看到过这一点。当我在 Any 之后使用 FirstOrDefault 时,ReSharper 会给我一个警告说 Possible 'System.NullReferenceException'。下面的示例:

Foo[] items = GetItems();
var myName = "MyName";
if (items.Any(x => x.Name == myName))
{
    var item = items.FirstOrDefault(x => x.Name == myName);
    var name = item.Name; // Possible 'System.NullReferenceException'
}

警告是否正确,或者上面的代码是否安全?

我知道我可以禁用警告,但这不是重点。我想确保 NullReferenceException 不可能发生。由于我首先检查 Any,因此 FirstOrDefault 应该 return 一项。还是我遗漏了什么?

上面的代码只是一个MCVE.

更新:

如评论中所述,代码可以优化(和简化)。问题不在于如何解决代码中的问题。但是,如果确实会发生 NullReferenceException,如 ReSharper 所述?

是因为FirstOrDefault。如果条件不匹配,它 returns NULL for 类。 ReSharper 此时不考虑 Any

您应该将其替换为对 First

的调用

这就像编译器 use of unassigned variable 当您确定您的变量是在逻辑上始终为 true 的 if 块中分配时发出的错误。简单的说。尝试将您的代码分析到这个级别是不可行的,因为静态分析器应该在编译时知道(或者更好地理解)您的变量在运行时的状态是什么

void Main()
{

    int a;
    Environment.CurrentDirectory = "C:\temp";
    if(Environment.CurrentDirectory == "C:\temp")
        a = 1;
    // Error - Use of unassigned variable 
    Console.WriteLine(a);
}

到这里,人脑可以看出,不给变量赋值是没有办法的,(没有其他线程乱用同一个属性,你查了参考源属性 行为),但编译器应该以同样的深度分析这段代码的含义,而在这个时间点,我们还没有。同样的规则适用于 Resharper,他们缺乏必要的 智能 来完成所有需要的事情(目前)