2012-10-03 12 views
19

In C#, wenn ichDer Operator + = mit Nullable-Typen in C#

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

schreiben würde ich erwarten, dass dies äquivalent zu sein:

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

und damit im ersten Beispiel x würde enthält 1 wie im zweiten Beispiel. Aber es ist nicht, es enthält null. Der Operator "+ =" scheint nicht auf nullwertfähige Typen zu arbeiten, wenn sie nicht zugewiesen wurden. Warum sollte das der Fall sein?

Bearbeiten: Wie bereits erwähnt, ist es, weil null + 1 = null und Betreiber Vorrang hat. In meiner Verteidigung, ich glaube, diese Linie in der MSDN mehrdeutig ist !:

Die vordefinierten unären und binären Operatoren und alle benutzerdefinierten Operatoren, die für Werttypen existieren auch von Nullable- Typen verwendet werden können. Diese Operatoren erzeugen einen Nullwert, wenn [ Operanden null sind; Andernfalls verwendet der Operator den enthaltenen Wert , um das Ergebnis zu berechnen. Hier

Antwort

33

ist der Unterschied zwischen den beiden Aussagen:

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

Die zweite ist nicht das, was Sie erwartet hatten.

Hier ist eine Aufschlüsselung der sie beide:

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 Ah, Operator Vorrang, mein alter Feind. Sie schlagen wieder! – JDB

+0

Hat '' '' keinen Vorrang vor '+'? (@ Servys Antwort) –

+4

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