2012-10-03 15 views
19

C#, jeśli napisaćOperator + = z pustych typu C#

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

by się spodziewać, że jest to równoważne z:

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

A zatem w pierwszym przykładzie, x byłoby zawierają 1 jak w drugim przykładzie. Ale tak nie jest, zawiera zero. Operator + = wydaje się nie działać na typach zerujących, jeśli nie zostały one przypisane. Dlaczego tak powinno być?

Edytuj: Jak wskazano, dzieje się tak dlatego, że null + 1 = null i pierwszeństwo operatora. W mojej obronie, myślę, że ta linia w MSDN jest niejednoznaczna !:

Predefiniowane jednoargumentowe i operatory binarne i wszystkie zdefiniowane przez użytkownika operatorów, które istnieją dla typów wartości mogą być również wykorzystywane przez pustych typów. Operatory te wytwarzają wartość pustą, jeśli argumenty [dowolnego z] są dowolne; w przeciwnym razie operator używa wartości zawartej do obliczyć wynik.

Odpowiedz

33

Oto różnica między tymi dwoma stwierdzeniami:

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

Drugi nie jest to, czego się spodziewaliśmy.

Oto podział ich obu:

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 Ach, operator pierwszeństwo, mój starożytny wróg. Znowu uderzasz! – JDB

+0

Czy "??" nie ma pierwszeństwa przed '+'? (@ Odpowiedź Servy'ego) –

+4

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