【问题标题】:ReSharper bug? Incorrect "expression is always true"ReSharper 错误?不正确的“表达式总是正确的”
【发布时间】:2011-07-30 13:52:28
【问题描述】:

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

【问题讨论】:

  • 而且我确实意识到,这种等待另一种方法将变量设置为 null 的 while 循环模式远非审美,但这不是重点。
  • 看起来循环内的其他代码可能会触发它。内部是否有中断、返回或继续控制语句?
  • 是的,我做到了。我现在没有确切的代码,我会在几个小时后发布。我还应该向 Kirk Woll 提一下,我没有准确测试我粘贴在问题中的代码,所以确实可能是由周围的代码引起的。

标签: c# resharper expression-evaluation


【解决方案1】:

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

【讨论】:

  • 表达式在第一次执行时总是为真这一事实并不重要,因为静态分析应该能够确定它将被执行多次。最重要的是,Resharper 建议我用 'someArray != null' 代替 'true',这显然是错误的。所以它的评价是不正确的。
【解决方案2】:

嗯,显然 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 循环的开始.所以即使someArray在Foo中被赋值为null,警告也是正确的。

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

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 2023-03-03
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多