[英]C# coalesce 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
。 但是我仍然很好奇為什么在第一個示例中忽略了左側部分。
“左邊的部分被簡單地忽略了”? 你真的認為有多大可能?
運算符優先級決定您的第一個版本的解析方式如下:
bool? result = (someCondition ?? someConditionOverride)
? false
: (bool?)null;
someCondition
不為空,而且是真的。 因此,此表達式的計算結果為true
:
(someCondition ?? someConditionOverride)
所以我們得到?
分支,整個表達式返回false
,就像你告訴它的那樣。
添加您添加的括號會完全改變表達式的含義。 它通過使表達的實際含義符合您的原始意圖,在有限的意義上解決您的困惑; 但編譯器永遠不會混淆。 在 C# 中,編譯器讓你感到困惑。
為了減少我自己的困惑,我從不依賴運算符優先級。 我將所有內容都括起來。 如果我設計了語言,語法將需要它(除非 Eric 過來告訴我為什么這畢竟不是一個好主意,出於某種原因,一旦 Eric 解釋,這對我來說將是完全有意義的)。
更新:預測得到驗證:Eric 過來說,有太多人會覺得必須將a + b * c
括起來很荒謬,如果你允許的話,就沒有合理的方法來定義例外。 好吧,如果他們不能容忍被迫將所有內容括起來,他們不會,無論我認為他們應該這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.