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,他们缺乏必要的 智能 来完成所有需要的事情(目前)
我使用的是 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,他们缺乏必要的 智能 来完成所有需要的事情(目前)