Was Sie sehen, ist der Unterschied zwischen der Verwendung von Enumerable.Sum
und dem tatsächlichen Hinzufügen der Werte selbst.
Wichtig ist hier, dass null
nicht Null ist. Auf den ersten Blick würden Sie denken, dass singleSum
sollte gleich 17 sein, aber das würde bedeuten, dass wir% null
basierend auf dem Datentyp der Referenz eine andere Semantik zuweisen müssten. Die Tatsache, dass dies ein int?
ist, macht keinen Unterschied - null
ist null
und sollte niemals semantisch mit der numerischen Konstante 0
gleich sein.
Die Implementierung von Enumerable.Sum
überspringt jeden Wert, der null
in der Sequenz ist, weshalb Sie das unterschiedliche Verhalten zwischen den beiden Tests sehen. Der zweite Test gibt jedoch richtig null
zurück, da der Compiler intelligent genug ist, um zu wissen, dass das Hinzufügen von irgendetwas zu null
zu null
führt.
Hier ist die Implementierung von Enumerable.Sum
, die einen Parameter von int?
akzeptiert:
Die .Sum()
Methode der nullbaren Typen ignoriert alle null
Werte:
MSDN: Enumerable.Sum Method (IEnumerable<Nullable<Int32>>)
Anmerkungen
Das Ergebnis enthält keine Nullwerte.
Wenn Sie hingegen eine Zahl über +
zu null
hinzufügen, lautet das Ergebnis null
.
Wie Andrew Hare bemerkt hat, macht es keinen Sinn, eine Zahl zu null
hinzuzufügen: null
ist nicht 0
; es ist einfach keine Nummer.