2012-10-03 7 views
19

、IはC#でNULL可能タイプの+ =演算子は、C#で

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

を書き込む場合、私は、これはと同等であることが期待されます第2の例のように1を含む。しかし、それはnullを含んでいません。 + =演算子は、割り当てられていない場合、null可能型では機能しないようです。なぜこれが当てはまるべきですか?

を編集します。これは、null + 1 = nullと演算子の優先順位のためです。私の守備では、私はMSDNにこの行があいまいだと思う!:

定義済みの単項および二項演算子と値型のために存在するすべてのユーザー定義 演算子はまた、NULL可能 種類によって使用することができます。これらの演算子は、[どちらか]の オペランドがヌルの場合はnull値を生成します。それ以外の場合、演算子は含まれる値を使用して 結果を計算します。ここで

答えて

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いいえ。 http://msdn.microsoft.com/en-us/library/6a71f45d.aspx –