试图理解为什么resharper告诉我表达总是错误的

时间:2013-01-24 20:42:14

标签: c# asp.net resharper

我有一个条件我写的是检查三件事。

if(LoggedInMembershipUser == null || obj == null || boolVal)

在这种情况下,“LoggedInMembershipUser”只是Membership.GetUser(),“obj”是一些随机业务对象,“boolVal”显然是一个布尔值。当我按上述方式编写语句时,resharper告诉我语句的boolVal部分始终为false。但是当我把boolVal放在startnig中时,我没有注意到这一点。

if(boolVal|| LoggedInMembershipUser == null || obj == null)

为什么第一个总是假的,但第二个不是?

编辑:这是在网格视图的行数据绑定中。网格显示来自具有相同基类的两个对象的结果,因此如果“obj”是其中一个对象类型而不是另一个,则“obj”将具有值。 boolVal是一个指示器,它是什么类型的对象现在,我想它,我想如果obj为null,那么boolVal将永远为真。 resharper意识到了一些如何?哦,我打赌这是因为我在我的行上方查看了我的代码:

if (!uploaded){
    var obj = GetObjectLogic();
}

好的感谢帮助评论。我想这可以投票删除或其他。

2 个答案:

答案 0 :(得分:15)

如果没有更多的方法,很难确定,但它看起来确实如下:

ReSharper确定boolVal可以成立的唯一方法是LoggedInMembershipUserobj中至少有一个为空。第一个if永远不会到达boolval部分,除非两者都不为空。因此,在评估boolVal时,它必须是假的。

如果重新排序条件,则该逻辑不再成立。 ReSharper可能会分析该表达式,确定所有部分都是快速且无副作用的,并注意到boolVal在第二种情况下也不是必需的,但该分析有点困难,显然还没有编写。

答案 1 :(得分:3)

每次我使用ReSharper调查了一个意外的Expression is always true|false场景时,该工具已证明比我聪明。例如,ReSharper知道继承树;在此代码块中:

void doSomething(Object obj)
{
    if(obj is StreamReader || obj is TextReader)
        foo();
}

... Resharper会将(obj is TextReader)标记为Expression is always false,因为(obj is StreamReader)代码分支已经捕获了任何TextReader个对象并跳转到foo(),短路任何进一步的评估。