LINQ Aggregiertes Verhalten von Typen, die NULL-Werte zulassen

8

Kann jemand erklären, was hier vor sich geht? Wie sind diese beiden Dinge wahr?

%Vor%

Warum gibt die Sum () -Methode nicht 'null' zurück? Oder die singleSum nicht gleich 17?

    
kiwipom 09.09.2010, 04:23
quelle

2 Antworten

4

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:

%Vor%     
Andrew Hare 09.09.2010, 04:33
quelle
6

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.

    
NullUserException 09.09.2010 04:33
quelle

Tags und Links