Resharper bug?不正确的“表达总是如此”

时间:2011-04-06 07:08:57

标签: c# resharper expression-evaluation

我相信我在resharper中发现了一个错误。假设我的代码如下:

int[] someArray = new int[10];
while (someArray  != null)
{
     //perhaps some other usage of someArray here, but not assigning it.
     SomeMethod(ref someArray );
}

如果局部变量some​​Array在其范围内未分配为null,则语句someArray != null将始终为true。但是,当该变量作为ref参数提供给另一个方法时,情况并非如此,因为它可能在该方法中被赋值为null。然后resharper错误地认为someArray != null仍然是真的。

我以为我会分享这些信息,因为我不确定我应该怎么做。首先,我希望有人验证这个错误,然后将其发送给JetBrains?

2 个答案:

答案 0 :(得分:9)

嗯,显然Resharper的静态分析比我聪明...... 我正确得到“表达式始终为真”的代码 - 警告是:

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正确地评估它(它是静态分析)。

相关问题