Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图理解为什么ReSharper告诉我这个表达总是错误的_C#_Asp.net_Resharper - Fatal编程技术网

C# 试图理解为什么ReSharper告诉我这个表达总是错误的

C# 试图理解为什么ReSharper告诉我这个表达总是错误的,c#,asp.net,resharper,C#,Asp.net,Resharper,我有一个条件,我正在写,检查三件事 if(LoggedInMembershipUser == null || obj == null || boolVal) 在本例中,“LoggedInMembershipUser”只是Membership.GetUser(),“obj”是一些随机的业务对象,“boolVal”显然是一个布尔值。当我像上面那样写语句时,ReSharper告诉我语句的布尔部分总是错误的。但当我把布尔瓦尔放在下面的开头时,我没有得到那个通知 if(boolVal|| LoggedI

我有一个条件,我正在写,检查三件事

if(LoggedInMembershipUser == null || obj == null || boolVal)
在本例中,“LoggedInMembershipUser”只是Membership.GetUser(),“obj”是一些随机的业务对象,“boolVal”显然是一个布尔值。当我像上面那样写语句时,ReSharper告诉我语句的布尔部分总是错误的。但当我把布尔瓦尔放在下面的开头时,我没有得到那个通知

if(boolVal|| LoggedInMembershipUser == null || obj == null)
为什么第一个总是错误的,而第二个不是

编辑:这在栅格视图的行数据绑定中。网格显示来自具有相同基类的两个对象的结果,因此如果“obj”是其中一种对象类型而不是另一种对象类型,“obj”将有一个值。boolVal是一个指示它是哪种类型的对象的指示器,所以现在我想,如果obj为null,那么boolVal将始终为真。雷沙珀不知怎么地意识到了这一点吗?哦,我打赌这是因为在我的代码行上方我看到了:

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

好的,谢谢你的帮助。我想这可能会被投票删除或其他任何东西。

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

ReSharper已确定,
boolVal
唯一可能为真的方法是
LoggedInMembershipUser
obj
中至少有一个为空。第一个
if
永远不会到达
boolval
部分,除非两者都不为null。因此,在计算
boolVal
时,它必须为false


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

每次我用ReSharper调查一个意外的
表达式总是正确的|错误的
场景时,这个工具都比我聪明。例如,ReSharper知道继承树;在此代码块中:

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

…ReSharper会将
(obj是TextReader)
标记为
表达式始终为false
,因为
(obj是StreamReader)
代码分支已经捕获了任何
TextReader
对象,并跳到
foo()
,短路了任何进一步的计算。

布尔
局部变量,一块地,还是一处地产?对于
obj
LoggedInMembershipUser
来说,同样的问题。我唯一想到的是短路。试着用
|
代替
|
,看看resharper是否还在抱怨。你能把一个(简短的)测试方法放在一起,这样我们就可以在上下文中看到它。@djkraze求值或语句有点像数学中的多重性规则。它的评估顺序并不重要,它将始终具有相同的顺序result@gh9是的,但是如果空检查为真,它不会到达
布尔值
,除非你把它移到前面。是的,就是这样。我在为我的帖子编辑时意识到了这一点。是的,我在发布我的答案后就注意到了你的编辑。算了吧!:-)