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

问题描述 投票:4回答:2

我相信我在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?

c# resharper expression-evaluation
2个回答
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,并且随之改变控制流程,使得未达到while循环的开始。因此,即使在Foo中将someArray指定为null,警告也是正确的。

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.