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

Ily*_*lya 4 c# dart

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

bool? _true = true;

bool? val1 = _true ?? true && false; //true
bool? val2 = (_true ?? true) && false; //false
Run Code Online (Sandbox Code Playgroud)

我以为结果应该是一样的,有人可以解释诸如行为吗?我注意到它至少在c#和dart中都相同,因此这应该是一个很好的理由。

Dav*_*idG 12

这是因为运算符具有优先权,因此&&操作是在执行之前进行的??。因此,您的第一行等效于:

bool? val1 = _true ?? (true && false);
Run Code Online (Sandbox Code Playgroud)


Len*_*art 5

空合并运算符的优先级较低。在第一个示例中,true && false计算结果为false,剩下的true ?? false计算结果为true

在第二个示例中,首先评估括号(至true),true && false结果为false


Ren*_*ogt 5

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

所以

bool? val1 = _true ?? true && false; //true
Run Code Online (Sandbox Code Playgroud)

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

在第二种情况下

bool? val2 = (_true ?? true) && false; //false
Run Code Online (Sandbox Code Playgroud)

括号中的部分true再次出现,但与的false结果为与false

请参阅C#运算符优先级