2017-06-07 63 views
4

为什么下面的代码返回false?C#coalesce运算符

public static void Main() 
{ 
    bool? someCondition = true; 
    bool someConditionOverride = false; 


    bool? result = someCondition ?? someConditionOverride ? false : (bool?)null; 

    Console.WriteLine(result); 
} 

我exprecting结果将是true,因为someConditionnull??运营商将返回true。不过看起来像右边的操作数是先计算出来的,左边的部分是简单的忽略。

添加括号解决困惑:

bool? result = someCondition ?? (someConditionOverride ? false : (bool?)null) 

而结果将是true。不过,我仍然很好奇为什么左边的部分在第一个例子中被忽略了。

+0

[C#空合并(??)运算符的运算符优先级是什么?](https://stackoverflow.com/questions/511093/what-is-the-operator-precedence-of-c-sharp- null-coalescing-operator)解释它......可能可以用作重复。 –

+0

这实际上是一个非常好的问题 –

+0

只需读取我期望首先评估的'''表达式,从而导致'false'返回。我不希望'?:'具有更高的优先级,就像我不希望'+'优先于'-' –

回答

17

“左侧部分简单忽略”?你真的认为这有多可能?

运算符优先级决定了你的第一个版本被解析,像这样:

bool? result = (someCondition ?? someConditionOverride) 
        ? false 
        : (bool?)null; 

someCondition不为空,这是真的。因此,该表达式的计算结果为true

(someCondition ?? someConditionOverride) 

所以我们得到了?分支,整个表达式返回false,就像你告诉它。

添加完全添加的括号可更改表达式的含义。它通过使表达的实际含义符合您的原意,从而在一定程度上解决了您的困惑;但编译器永远不会混淆。在C#中,编译器会混淆you

为了减少我自己的困惑,我从不依赖于运算符优先级。我将所有内容加括号。如果我设计了语言,语法会需要它(除非Eric来了,并告诉我为什么这毕竟不是一个好主意,出于某种原因,一旦Eric解释它,这对我来说是完全有意义的)。

UPDATE:预测验证:埃里克走过来,说,太多人会觉得可笑不得不加上括号a + b * c,如果你允许,有定义异常没有合理的方式。那么,如果他们不能容忍被强迫所有的东西加上括号,他们就不会,不管我认为他们应该多少。

+4

“在C#中,编译器会让你感到困惑” - 仅为+1! –

+1

我会投票支持“我将所有内容加括起来,如果我设计了语言,那么语法就需要它。”这就是故事的本质 – Artem

+0

@Artem为什么'?:'比'''有更高的优先级?我希望操作员从左至右 –