2012-10-03 73 views
19

在C#,如果我寫與空類型+ =操作符在C#

int? x = null; 
x += x ?? 1 

我期望這是等效於:

int? x = null; 
x = x + x ?? 1 

因而在第一示例中,x將包含1,如第二個例子中所示。但它不,它包含null。未分配時,+ =運算符似乎不適用於可空類型。爲什麼會這樣呢?

編輯:正如指出的那樣,這是因爲null + 1 = null和運算符的優先級。在我的防守,我覺得這條線在MSDN是模糊的!:

預定義的一元和二元運營商和用戶定義的任何 運營商存在的值類型也可以通過可空類型 使用。如果[或 的任一個操作數爲空,則這些運算符產生空值;否則,操作員使用所包含的值來計算結果 。

回答

33

下面是兩個語句之間的區別:

x += x ?? 1 
x = (x + x) ?? 1 

第二個是不是你期待什麼。

這裏是他們兩個的崩潰:

x += x ?? 1 
x += null ?? 1 
x += 1 
x = x + 1 
x = null + 1 
x = null 

x = x + x ?? 1 
x = null + null ?? 1 
x = null ?? 1 
x = 1 
+7

+1啊,運算符優先級,我的古老的敵人。你再次擊中! – JDB

+0

不是'??'優先於'+'嗎? (@ Servy的回答) –

+4

@AustinSalonen Nope。 http://msdn.microsoft.com/en-us/library/6a71f45d.aspx –