2017-06-07 149 views
4

爲什麼下面的代碼返回false?C#coalesce運算符

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


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

    Console.WriteLine(result); 
} 

我exprecting結果將是true,因爲someConditionnull??運營商將返回true。不過看起來像右邊的操作數是先計算出來的,左邊的部分是簡單的忽略。

添加括號解決困惑:

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

而結果將是true。不過,我仍然很好奇爲什麼左邊的部分在第一個例子中被忽略了。

+0

[C#空合併(??)運算符的運算符優先級是什麼?](https://stackoverflow.com/questions/511093/what-is-the-operator-precedence-of-c-sharp- null-coalescing-operator)解釋它......可能可以用作重複。 –

+0

這實際上是一個非常好的問題 –

+0

只需讀取我期望首先評估的'''表達式,從而導致'false'返回。我不希望'?:'具有更高的優先級,就像我不希望'+'優先於'-' –

回答

17

「左側部分簡單忽略」?你真的認爲這有多可能?

運算符優先級決定了你的第一個版本被解析,像這樣:

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

someCondition不爲空,這是真的。因此,該表達式的計算結果爲true

(someCondition ?? someConditionOverride) 

所以我們得到了?分支,整個表達式返回false,就像你告訴它。

添加完全添加的括號可更改表達式的含義。它通過使表達的實際含義符合您的原意,從而在一定程度上解決了您的困惑;但編譯器永遠不會混淆。在C#中,編譯器會混淆you

爲了減少我自己的困惑,我從不依賴於運算符優先級。我將所有內容加括號。如果我設計了語言,語法會需要它(除非Eric來了,並告訴我爲什麼這畢竟不是一個好主意,出於某種原因,一旦Eric解釋它,這對我來說是完全有意義的)。

UPDATE:預測驗證:埃裏克走過來,說,太多人會覺得可笑不得不加上括號a + b * c,如果你允許,有定義異常沒有合理的方式。那麼,如果他們不能容忍被強迫所有的東西加上括號,他們就不會,不管我認爲他們應該多少。

+4

「在C#中,編譯器會讓你感到困惑」 - 僅爲+1! –

+1

我會投票支持「我將所有內容加括起來,如果我設計了語言,那麼語法就需要它。」這就是故事的本質 – Artem

+0

@Artem爲什麼'?:'比'''有更高的優先級?我希望操作員從左至右 –