4

我相信我在 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将始终为真。但是,当该变量作为 ref 参数提供给另一个方法时,情况并非如此,因为它可以在该方法中被分配给 null。然后 ReSharper 错误地假设这someArray != null仍然是正确的。

我想我会分享这些信息,因为我不确定我应该如何处理它。首先,我希望有人验证此错误,然后将其发送给 JetBrains?

4

2 回答 2

11

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

int[] someArray = new int[10];
while (someArray != null)
{
    Foo(ref someArray);
    someArray.Bar();
}

我收到了多余的警告someArray != null,所以我认为 ReSharper 误解了 ref 参数,因为someArray实际上可以将其分配给 null。但这不是警告正确的原因。然后一个微妙的事实发挥了作用:someArraynull 意味着方法调用Bar将抛出 a NullReferenceException,并随之改变控制流,从而无法到达 while 循环的开始。因此,即使someArray在 Foo 中分配为 null,警告也是正确的。

我的错,谢谢大家的努力。

于 2011-04-06T16:06:07.837 回答
1

尝试将此循环更改为 do-while 并检查 ReSharper 在这种情况下标记它的内容。它仍然是真的吗?但是在第一个循环中,它确实“始终正确”,因此 ReSharper 会正确评估它(它是静态分析)。

于 2011-04-06T07:13:03.663 回答