我相信我在resharper中发现了一个错误。假设我的代码如下:
int[] someArray = new int[10];
while (someArray != null)
{
//perhaps some other usage of someArray here, but not assigning it.
SomeMethod(ref someArray );
}
如果局部变量someArray在其作用域中未指定为null,则语句someArray != null
将始终为true。但是,当该变量作为ref参数提供给另一个方法时,情况并非如此,因为它可能在该方法中被赋值为null。然后resharper错误地认为someArray != null
仍然是真的。
我以为我会分享这些信息,因为我不确定我应该怎么做。首先,我希望有人验证这个错误,然后将其发送给JetBrains?
嗯,显然Resharper的静态分析比我聪明......我正确地得到“表达总是如此”的代码 - 警告是:
int[] someArray = new int[10];
while (someArray != null)
{
Foo(ref someArray);
someArray.Bar();
}
我得到someArray != null
多余的警告,所以我认为Resharper误解了ref参数,因为someArray
实际上可以被赋值为null。但这并不是警告正确的原因。然后一个微妙的事实发挥作用:someArray
为null意味着Bar
的方法调用将抛出NullReferenceException
,并且随之改变控制流程,使得未达到while循环的开始。因此,即使在Foo中将someArray
指定为null,警告也是正确的。
我的错误,谢谢大家的努力。
尝试将此循环更改为do-while并检查在这种情况下resharper标记的内容。它仍然是真的吗?但是在第一个循环中它确实“总是正确的”,因此resharper正确地评估它(它是静态分析)。