为什么以下代码返回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
。但是我仍然很好奇为什么在第一个例子中忽略了左边部分。
答案 0 :(得分:17)
“左边部分被忽略”?你认为这有多大可能性?
运算符优先级规定您的第一个版本解析如下:
bool? result = (someCondition ?? someConditionOverride)
? false
: (bool?)null;
someCondition
不为空,这是真的。因此,此表达式的计算结果为true
:
(someCondition ?? someConditionOverride)
所以我们得到?
分支,整个表达式返回false
,就像你告诉它的那样。
添加您添加的括号会更改表达式的含义。它通过使表达式的实际含义符合您的原始意图,在有限的意义上解决了您的困惑;但编译器永远不会混淆。在C#中,编译器会将你混淆。
为了减少我自己的困惑,我从不依赖运算符优先级。我把所有事情都括起来。如果我设计了这门语言,那么语法就需要它(除非Eric来了并告诉我为什么毕竟这不是一个好主意,因为某些原因,一旦Eric解释它就会对我有意义。)
更新:预测已经过验证:Eric过来并说有太多人会觉得必须加上a + b * c
括号,如果你允许,那就没有合理的方法来定义例外。好吧,如果他们不会容忍被迫将所有事情都包括在内,他们就不会这么做,我认为他们应该这么做。