c#List.Exists返回true,并带有“;假及&;“真的”;

c#List.Exists返回true,并带有“;假及&;“真的”;,c#,list,boolean,operator-keyword,exists,C#,List,Boolean,Operator Keyword,Exists,所以我在编写一个程序,对Listoperator的行为有点困惑。我有一个列表,想知道根据一些标准它是否包含一个条目。 现在我们将其称为列表,obj具有以下属性: public string PropA { get; set; } public string PropB { get; set; } public string PropC { get; set; } public bool HasPropC { get; set; } 现在,我只想要一个真实的结果,如果PropA等于列表中的1,并

所以我在编写一个程序,对Listoperator的行为有点困惑。我有一个列表,想知道根据一些标准它是否包含一个条目。 现在我们将其称为列表,obj具有以下属性:

public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
public bool HasPropC { get; set; }
现在,我只想要一个真实的结果,如果PropA等于列表中的1,并且如果列表中的属性有as PropC,则应该检查PropC,否则为PropB。 我使用了这段代码:

 if (List.Exists(x => {
       bool b = true;

       b = b && x.PropA.Equals(obj.PropA);
       b = b && x.HasPropC ? x.PropC.Equals(obj.PropC) : x.PropB.Equals(obj.PropB);

       return b;
}))
在第一行“PropA.Equals…”之后,b被设置为false。但是,这条线使它再次成为现实。所以看起来好像有一个物体,即使它不是。我找到了一个解决方案,我将&-运算符后面的第二行用括号括起来,但我仍然不知道为什么它由假a真组成

你能给我一个提示吗

谢谢。

在表达式中

b && x.HasPropC ? x.PropC.Equals(obj.PropC) : x.PropB.Equals(obj.PropB);
&&
运算符优先于
?:
运算符。因此,当您对其求值时,
b&&x.HasPropC
已求值为false,
b
被赋值为
x.PropB.Equals(obj.PropB)

表达式中的

b && x.HasPropC ? x.PropC.Equals(obj.PropC) : x.PropB.Equals(obj.PropB);

&&
运算符优先于
?:
运算符。因此,当您对其求值时,
b&&x.HasPropC
已求值为false,
b
被赋值为
x.PropB.Equals(obj.PropB)

您需要将其更改为
b=b&&(x.HasPropC?x.PropC.Equals(obj.PropC):x.PropB.Equals(obj.PropB))
否则它将与
b
x.HasPropC
进行ANDing,并使用该and来确定要执行并分配给
b
的条件的哪一部分。您需要将其更改为
b=b&(x.HasPropC?x.PropC.Equals(obj.PropC):x.PropB.Equals(obj.PropB))
否则它将与
b
x.HasPropC
进行ANDing,并使用该and来确定要执行并分配给
b
@HimBromBeere OP的条件的哪一部分,他已经解释过他设法解决了问题(使用大括号禁用运算符优先级),他只是要求澄清为什么会发生这种情况。@HimBromBeere OP已经解释说他设法解决了这个问题(使用大括号禁用运算符优先级),只是要求澄清为什么会发生这种情况。