ReSharper是否正确处理Debug.Assert(..)?

rhe*_*980 5 c# debugging resharper assert

我的代码我正在使用System.Function方法Debug.Assert(..)验证方法开头的输入参数(请参阅下面的示例代码剪切):

public class TestClass : IInterface
{
}

public class Verifier
  {
     public static void Verify(IInterface objectToVerify)
     {
        Debug.Assert((objectToVerify is TestClass), "Passed object must be type of TestClass");

        // ReSharper (Version 7.1.1) marks here "Expression is always false
        if (!(objectToVerify is TestClass))
        {
           return;
        }

        // do something ...
     }
  }
Run Code Online (Sandbox Code Playgroud)

如果我注释掉该Debug.Assert声明,ReSharper警告就会消失.在我看来,ReSharper必须忽略这个Debug.Assert陈述,因为如果Debug.Assert语句没有完成,则执行下面的代码(例如,在发布模式下)

你有什么意见?或者是否有其他实施方案?

Isa*_*avo 9

不,我认为resharper是错误的,原因很简单: Resharper说,当我们知道事实并非如此时,代码是无法访问的.

如果在对话框中单击"忽略",则发布版本将始终执行该代码,调试版本将触发它.

在断言是否是错误之后继续并不重要,它仍然是无法访问的代码.


Fré*_*idi 2

ReSharper 足够聪明,知道Debug.Assert()如果objectToVerify不是TestClass. 因此,if语句中的表达式确实总是false(否则if首先不会到达该语句)。

您可以通过编写以下内容来解决该警告:

public static void Verify(IInterface objectToVerify)
{
    if (!(objectToVerify is TestClass))
    {
        Debug.Assert(false, "Passed object must be type of TestClass");
        return;
    }

    // do something ...
}
Run Code Online (Sandbox Code Playgroud)

  • 您提出的解决方案的附录:我没有意识到在您的解决方案中您将遇到与我的问题的解决方案中相同的问题。由于 Debug.Assert() 语句始终为 false,因此 ReSharper 会检测到“return;” 声明为“无法访问的代码”.. (3认同)
  • 这怎么能成为公认的答案呢?Assert 并不总是停止执行,那么 Resharper 如何“足够聪明”来知道这一点? (2认同)