2017-04-11 24 views
2

我有類似下面的代碼添加?運營商導致最後消失。爲什麼LastName不顯示在C#字符串concat運算符下方

預期結果:是,如果第一爲null,則第一將通過「」和「取代」將與最後給剛剛最後作爲結果進行串連。

實際結果:發生了什麼是我得到的結果只是第一個

var first = "Joe"; 
var last = "Smith" 
var str1 = first + last; // gives "JoeSmith" 
var str2 = first ?? "" + last // gives "Joe" 
+1

我不明白爲什麼你預計只有最後的名字被顯示。 [null-coalescing運算符](https://msdn.microsoft.com/en-us/library/ms173224.aspx)返回左側操作數(如果它不爲null),否則需要評估並返回右側手操作數。在你的例子中,「Joe」顯然不是null。 –

+0

事實上,你可能想澄清第三句話 - 你的意思是「我認爲如果'first'爲空,它會只是姓'」? –

+0

運算符優先級。 –

回答

12

這是一個優先問題。 +結合比??更緊密,所以你的代碼是有效的:

var str2 = first ?? ("" + last) 

這聽起來像你可能是指:

var str2 = (first ?? "") + last 

但有沒有意義的,因爲字符串連接用null等效於字符串連接用一個空字符串 - 所以只需使用first + last,因爲您已經使用str1

+0

謝謝@ jon-skeet有道理。我不應該比早上7點之前的代碼更好。 –

+0

@PeterKellner:我發現一天中的時間並不像咖啡因水平那麼重要:) –

+0

當沒有太多需要解決的問題時,我不希望編輯其他人的答案。另外,我誤解了日期,並認爲這比它年代大得多,哎呦。 –

2

這是空合併運算符??的預期行爲。它將使用第一個值,除非它爲空,在這種情況下它將落入第二個值。考慮一下這似乎與替代變量:

var str2 = "Joe" ?? "" + "Smith"; 

由於「喬」不爲空,它將設置str2到並忽略表達式的其餘部分。如果你想只合並的第一個名字,那麼你就需要將它與括號組與空字符串替換的first任何空實例:

var str2 = (first ?? "") + last; 

然而,這真的不會有任何區別的現有的代碼,因爲你的null將只是一個空字符串,併產生相同的東西。

0

從MSDN:

的?運算符稱爲空合併運算符。如果操作數不爲null,則返回左側的操作數;否則返回右手操作數。

由於第一不是null返回「喬」

+1

雖然OP對優先級感到困惑 - 但他預計部分是* then *之後是連接。 –

+0

請解釋爲什麼這是關閉的話題。 –

相關問題