C#coalesce operator

时间:2017-06-07 15:52:14

标签: c# null-coalescing-operator

为什么以下代码返回false?

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


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

    Console.WriteLine(result);
}

我正在表示结果为true,因为someCondition不是null??运算符会返回true。然而,首先计算右操作数,然后忽略左边部分。

添加括号可以解决这个问题:

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

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

1 个答案:

答案 0 :(得分:17)

“左边部分被忽略”?你认为这有多大可能性?

运算符优先级规定您的第一个版本解析如下:

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

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

(someCondition ?? someConditionOverride) 

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

添加您添加的括号会更改表达式的含义。它通过使表达式的实际含义符合您的原始意图,在有限的意义上解决了您的困惑;但编译器永远不会混淆。在C#中,编译器会将混淆。

为了减少我自己的困惑,我从不依赖运算符优先级。我把所有事情都括起来。如果我设计了这门语言,那么语法就需要它(除非Eric来了并告诉我为什么毕竟这不是一个好主意,因为某些原因,一旦Eric解释它就会对我有意义。)

更新:预测已经过验证:Eric过来并说有太多人会觉得必须加上a + b * c括号,如果你允许,那就没有合理的方法来定义例外。好吧,如果他们不会容忍被迫将所有事情都包括在内,他们就不会这么做,我认为他们应该这么做。