空合并运算符,行为不可预测

时间:2019-05-24 09:53:26

标签: c# dart

我对流代码的结果感到困惑:

bool? _true = true;

bool? val1 = _true ?? true && false; //true
bool? val2 = (_true ?? true) && false; //false

我认为结果应该是一样的,任何人都可以解释诸如行为? 我注意到它至少在c#和dart中都相同,因此这应该是这样做的充分理由。

4 个答案:

答案 0 :(得分:12)

这是由于operator precedence导致&&操作在??之前执行。因此,您的第一行等效于:

bool? val1 = _true ?? (true && false);

答案 1 :(得分:5)

null-coalescing运算符的优先级较低。在第一个示例中,true && false的值为false,剩下的true ?? false的值为true

在第二个示例中,首先评估括号(到true),剩下的true && false产生false

答案 2 :(得分:5)

逻辑和运算符(&&)的优先级高于空合并运算符(??)。

所以

bool? val1 = _true ?? true && false; //true

等于_true ?? (true && false)。由于_true不为null,因此null合并运算符将返回该值(true)。

第二种情况

bool? val2 = (_true ?? true) && false; //false

方括号中的部分再次为true,但与false进行与运算得到false

请参见C# operator precedence

答案 3 :(得分:3)

如果在第一种情况下添加隐式括号,则更有意义

bool? _true = true;

bool? val1 = _true ?? (true && false); //true
bool? val2 = (_true ?? true) && false; //false

由于_true不为null,因此??之后没有任何评估。