2013-06-28 13 views
5

Ich habe kürzlich eine Neugier bemerkt (zumindest für mich). Ich dachte, dass die null-coalescing operator würde Vorrang vor jeder mathematischen Operation, aber offensichtlich war ich falsch. Ich dachte, zwei Variablen folgende würde den gleichen Wert am Ende haben:Warum muss ich den Nullkoaleszenzoperator in Klammern setzen?

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

Aber v2.Value ist (die gewünschte) 1 während v1.Value ist noch 0. Warum?

Demo

+0

könnte helfen: http://en.csharp-online.net/ECMA-334%3a_14.2.1_Operator_precedence_and_associativity auch http : //stackoverflow.com/questions/511093/what-is-the-operator-precedence-of-c-sharp-null-coalescing-operator – Ric

Antwort

8

v1 0 für den genauen Grund, warum Sie erwähnt: die Null-Koaleszenz-Operator tatsächlich relativ niedrige Priorität hat. This table zeigt genau wie niedrig.

So zum ersten Ausdruck wird 1 + null zuerst ausgewertet, und es wertet auf einen null int?, die dann auf 0

1

v2 verschmilzt sagt, 1 plus (wenn previousValue == null der Wert von 0 bis 1 hinzufügen , das gibt 1.Die v1 sagt 1 plus Null ist null, so lassen Sie uns zurück 0.