簡體   English   中英

C# 合並運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM