我相信我在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?
答案 0 :(得分:9)
int[] someArray = new int[10];
while (someArray != null)
{
Foo(ref someArray);
someArray.Bar();
}
我收到someArray != null
多余的警告,所以我认为Resharper误解了ref参数,因为someArray
实际上可以指定为null。但这并不是警告正确的原因。然后一个微妙的事实发挥作用:someArray
为null将意味着Bar
的方法调用将抛出NullReferenceException
,并随之改变控制流,以便开始时间 - 没有到达环路。因此,即使在Foo中将someArray
指定为null,警告也是正确的。
我的错误,谢谢大家的努力。
答案 1 :(得分:1)
尝试将此循环更改为do-while并检查在这种情况下resharper将其标记为什么。它仍然是真的吗? 但是在第一个循环中它确实“总是正确的”,因此resharper正确地评估它(它是静态分析)。