C# 合并运算符

C# coalesce operator

为什么下面的代码 return 是错误的?

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


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

    Console.WriteLine(result);
}

我预计结果将是 true,因为 someCondition 不是 null 并且 ?? 运算符将 return true。然而看起来右操作数首先被计算而左边的部分被简单地忽略。

添加括号解决混淆:

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

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

"the left part is simply ignored"?你真的认为那有多大可能?

运算符优先级决定了您的第一个版本是这样解析的:

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

someCondition 不为空,而且为真。因此,此表达式的计算结果为 true:

(someCondition ?? someConditionOverride) 

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

添加您添加的括号会完全改变表达式的含义。它通过使表达式的实际含义与您的原始意图保持一致,在有限的意义上解决了您的困惑;但编译器永远不会混淆。在 C# 中,编译器混淆了 you

为了减少我自己的困惑,我从不依赖运算符优先级。我把所有东西都用括号括起来。如果我设计了这门语言,那么语法就会需要它(除非埃里克过来告诉我为什么这实际上不是一个好主意,因为某种原因,一旦埃里克解释了它,我就会完全理解它)。

更新: 预测已验证:Eric 过来说,太多人会觉得必须用括号括起来很荒谬 a + b * c,如果你允许的话,有没有合理的方法来定义异常。好吧,如果他们不能容忍被迫给所有东西加上括号,他们就不会,不管我认为他们应该怎样。