2013-01-24 20 views
12

我有一个条件我写这是检查三件事情。试图理解为什么resharper告诉我表达式总是假的

if(LoggedInMembershipUser == null || obj == null || boolVal) 
在这种情况下,“LoggedInMembershipUser”

只是Membership.GetUser()“目标文件”是一些随机的业务对象,而“boolVal”显然是一个布尔值。当我按照上面的语句编写语句时,resharper告诉我,语句的boolVal部分总是为false。但是当我把boolVal作为下面的beginnig时,我没有得到这个通知。

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

为什么第一个总是假而第二个不是?

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

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

好的感谢您的帮助意见。我想这可以被投票删除或其他。

+2

“boolVal”是局部变量,字段还是属性?对于'obj'和'LoggedInMembershipUser'也是同样的问题。 –

+0

唯一想到的就是短路。尝试使用'|'而不是'||'来查看resharper是否仍然抱怨。 – juharr

+0

你可以把(短)测试方法放在一起,以便我们可以在上下文中看到这一点。 – gh9

回答

15

没有更多的是很难确切知道方法,但它看起来确实IKE如下:

ReSharper的已确定的唯一途径是boolVal可以是真实的是如果LoggedInMembershipUserobj至少一个一片空白。那第一个if永远不会到达boolval部分,除非两者都不为空。因此,在评估boolVal时它必须是假的。

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

+0

是的,这是怎么回事。当我为我的帖子创建编辑时,我意识到了这一点。 – William

+0

是的,我发布我的答案后,我注意到你的编辑权。去搞清楚! :-) –

2

每当我用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(),短路任何进一步的评估。

相关问题