gpt4 book ai didi

C# 合并运算符

转载 作者:太空狗 更新时间:2023-10-29 23:59:40 25 4
gpt4 key购买 nike

为什么下面的代码返回false?

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


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

Console.WriteLine(result);
}

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

添加括号解决混淆:

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

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

最佳答案

“左边的部分被忽略了”?你真的认为那有多大可能?

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

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

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

(someCondition ?? someConditionOverride) 

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

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

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

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

关于C# 合并运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44417468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com