簡體   English   中英

C# null-coalescing (??) 運算符的運算符優先級是什么?

[英]What is the operator precedence of C# null-coalescing (??) operator?

我剛剛嘗試了以下方法,其想法是將兩個字符串連接起來,用一個空字符串代替空值。

string a="Hello";
string b=" World";

- 調試(有趣的是?是打印,並不完全有助於可讀性......)

 ? a ?? "" + b ?? "" 

->“你好”

正確的是:

? (a??"")+(b??"")
"Hello World"

我有點期待“Hello World”,或者如果 a 為空,則只是“World”。 顯然,這與運算符優先級有關,可以用括號來克服,是否有任何地方記錄了這個新運算符的優先級順序。

(意識到我可能應該使用 stringbuilder 或 String.Concat)

謝謝。

除了您希望優先級是什么、根據 ECMA 是什么、根據 MS 規范是什么以及 csc 實際做什么之外,我還有一點建議:

不要這樣做

我認為寫得清楚:

string c = (a ?? "") + (b ?? "");

或者,鑒於字符串連接中的 null 最終只是一個空字符串,只需編寫:

string c = a + b;

編輯:關於記錄的優先級,在C# 3.0 規范(Word 文檔)和ECMA-334中,加法綁定比 ?? 更緊密,它比賦值更緊密。 IMO,另一個答案中給出的 MSDN 鏈接是錯誤和奇怪的。 2008 年 7 月在頁面上顯示的更改移動了條件運算符 - 但顯然不正確!

永遠不要依賴運算符優先級。 始終明確指定您希望代碼如何運行。 當您回到您的代碼時,請幫自己和他人一個忙。

(a ?? "") + (b ?? "")

這沒有任何模棱兩可的余地。 歧義是錯誤的溫床。

運算符優先級記錄在MSDN上。

然而,MSDN 上的優先級與來自 Microsoft 的可下載 C# 規范ECMA 上的規范的優先級相矛盾。 這有點奇怪。

無論如何,正如 Jon Skeet 在他的回應中所說,最好不要依賴運算符的優先級,而是通過使用括號來明確。

有趣的是http://msdn.microsoft.com/en-us/library/6a71f45d.aspxhttp://en.csharp-online.net/ECMA-334:_14.2.1_Operator_precedence_and_associativity給 ?? 賦予了不同的優先級。

微博:

  1. 有條件的
  2. 任務
  3. 空合並
  4. 拉姆達

ECMA:

  1. 空值合並
  2. 有條件的
  3. 任務

我認為msdn一定是錯誤的,考慮:

string a = null;
string b = a ?? "foo";
// What is b now?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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