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
,如果你允许的话,有没有合理的方法来定义异常。好吧,如果他们不能容忍被迫给所有东西加上括号,他们就不会,不管我认为他们应该怎样。
为什么下面的代码 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
,如果你允许的话,有没有合理的方法来定义异常。好吧,如果他们不能容忍被迫给所有东西加上括号,他们就不会,不管我认为他们应该怎样。