2013-06-28 14 views
5

Niedawno zauważyłem ciekawość (przynajmniej dla mnie). Myślałem, że null-coalescing operator ma pierwszeństwo przed jakąkolwiek operacją matematyczną, ale oczywiście byłem w błędzie. Myślałem, że po dwóch zmiennych byłoby mieć taką samą wartość na koniec:Dlaczego muszę umieścić operator koalescencyjny w nawiasach?

double? previousValue = null; 
double? v1 = 1 + previousValue ?? 0; 
double? v2 = 1 + (previousValue ?? 0); 

Ale v2.Value jest (żądany) 1 natomiast v1.Value wciąż 0. Dlaczego?

Demo

+0

może pomóc: http://en.csharp-online.net/ECMA-334%3a_14.2.1_Operator_precedence_and_associativity również http : //stackoverflow.com/questions/511093/what-is--operator-precedence-c-sharp-null-coalescing-operator – Ric

Odpowiedz

8

v1 wynosi 0 do dokładnego powodu wymienić: operator null koalescencyjny rzeczywiście ma stosunkowo niski priorytet. This table pokazuje dokładnie, jak nisko.

Tak dla pierwszego wyrazu, 1 + null ocenia najpierw, a wynikiem jest null int?, który następnie ulega koalescencji 0.

1

v2 mówi, 1 Plus (jeśli previousValue == null dodać do 1 Wartość 0 , co daje 1.The v1 mówi 1 plus null jest pusty, więc pozwala zwrócić 0.