2013-07-14 15 views
5

Angenommen, ein C# -Programm mit zwei nullwertfähigen Dezimaleigenschaften A und B. Die folgende Addition gibt nur den Wert von A zurück: var result = A ?? 0 + B ?? 0; Die korrekte Verwendung ist: var Ergebnis = (A ?? 0) + (B ?? 0);C# -Zusatz mit Nullwert Dezimalstellen und Vorrang von ?? Operator

Beispielkonsolenprogramm:

class Program 
{ 
    static void Main(string[] args) 
    { 
     A = (decimal)0.11; 
     B = (decimal)0.69; 

     NullableDecimalAddition(); 

     Console.ReadLine(); 
    } 

    public static decimal? A { get; set; } 
    public static decimal? B { get; set; } 

    private static void NullableDecimalAddition() 
    { 
     decimal result1 = A ?? 0 + B ?? 0; 
     decimal result2 = (A ?? 0) + (B ?? 0); 
     Console.WriteLine("result1: " + result1); // = 0.11 
     Console.WriteLine("result2: " + result2); // = 0.80 
    } 
} 

Meine Frage ist was bei der Berechnung mit result1 geschieht. Wie ist der Vorrang der + und ?? Betreiber?

Antwort

8

tinstaafls Antwort ist korrekt. So erweitern Sie darauf:

Der ?? Operator ist rechts assoziativen und der + Operator ist eine höhere Priorität. Daher entspricht A ?? 0 + B ?? 0A ?? ((0 + B) ?? 0), nicht (A ?? 0) + (B ?? 0).

Deshalb ist die Wirkung von A ?? 0 + B ?? 0 ist:

  • Compute A, die Sie Zustand vom Typ Nullable-dezimal ist. Wenn es nicht null ist, erhalte seinen Dezimalwert als Ergebnis. Wir sind jetzt fertig; B wird nie berechnet.
  • Die Null wurde bereits vom Compiler in Dezimal konvertiert und ihre Null-Überprüfung für die angehobenen Arithmetik ist elided. (Einzelheiten siehe my series of articles on how nullable arithmetic is optimized by the compiler.)
  • B wird berechnet und auf Null geprüft. Wenn es null ist, ist das Ergebnis der Addition null; Wenn nicht, dann ist das Ergebnis der Addition eine nullbare Dezimalzahl.
  • Das Ergebnis der Addition wird jetzt auf Null überprüft. Wenn es Null ist, ist das Ergebnis Null (wieder bereits in Dezimal konvertiert). Wenn es nicht null ist, wird sein Wert abgerufen und das wird das Ergebnis.

Dies ist nicht Ihre beabsichtigte Aktion; Sie können Ihre beabsichtigte Aktion mit erreichen. Wenn Sie im Gegensatz dazu meinen, "null verwenden, wenn entweder null ist" dann können Sie (A + B) ?? 0 verwenden. Die Klammern sind in letzterem überflüssig, aber eine gute Idee, da Sie hinsichtlich des Vorrangs von + vs ?? verwirrt waren.

+0

Ok, danke für die richtige Antwort – FSou1

+0

Es ist brillant, wenn wir diese Art von Informationen bekommen –

+0

Vielen Dank für die Antworten und Erklärungen. – Nicolo

2

Ohne die() in der ersten Aussage, sagen Sie die erste? Operator, um 0 + B zurückzugeben, wenn A null ist, und das zweite ?? Der Operator gibt 0 zurück, wenn B null ist. deshalb, da der Operator + von der? operator Die Anweisung gibt nur A zurück. Wenn Sie A auf null setzen, sollte es zurückkehren .69

1

Ich denke, was noch wichtiger ist, Sie sollten dies nicht der Interpretation von jemandem überlassen, dies ist ein klares Beispiel dafür, wann Sie immer verwenden sollten Klammern für die Lesbarkeit und die Vermeidung von Zweifeln. Wartung hat Priorität.

+1

Tatsächlich wird die Addition zuerst ausgeführt, dann die erste Koaleszenz, dann die zweite Koaleszenz. Also 'A ?? 0 + B ?? 0 ist äquivalent zu A ?? (0 + B) ?? 0', nicht 'A ?? (0 + B ?? 0) ' –

+0

danke, das war mir nicht bewusst, ich werde meinen Beitrag bearbeiten, um nur meine Empfehlung in Bezug auf Lesbarkeit zu verlassen. –

+0

@RobertHarvey: Ihr Kommentar ist falsch. Null Koaleszenz ist rechts assoziativ und Addition hat höhere Priorität, also 'A ?? 0 + B ?? 0', 'A ?? (0 + B) ?? 0' und 'A ?? (0 + B ?? 0) 'sind alle äquivalent zu 'A ??((0 + B) ?? 0) '. Gleichwertige Dinge sind per Definition gleichwertig; das ist was "gleichwertig" bedeutet. –