Mathematische Operationen mit Nullable-Types

27. November 2014
Value-Types können per Definition nicht null sein. Sie können jedoch durch die Klasse System.Nullable gewrappt werden – C# erlaubt eine verkürzte Darstellung mit Fragezeichen nach dem Typ –, sodass einer Variablen nun auch der Wert null zugewiesen werden kann. Doch wie verhält sich eine solche Variable bei mathematischen Operationen, wie z. B. einer Multiplikation?

Wir haben beispielsweise drei Variablen des gleichen Typs, die wir miteinander multiplizieren möchten, von der jedoch eine nullable ist.

   1: int a = 20;

   2: int b = 30;

   3: int? c = null;

   4:  

   5: int? result = a * b * c;

Nun stellt sich die Frage, was bei der Berechnung als Ergebnis herauskommt.

Eine erste Annahme könnte sein, dass eine Exception geworfen wird. Das passiert jedoch nicht. Eine zweite Annahme könnte sein, dass anstatt null der Wert 0 angenommen wird. Auch das passiert nicht. Null ist nicht definiert, und somit kann kein bestimmter Wert angenommen werden – auch nicht 0.

Führen wir generell mathematische Operationen mit Variablen unterschiedlicher Typen durch, so ist das Ergebnis immer vom Typ des "größeren" Typs (int + long = long, etc.). Ist ein Typ davon jedoch Nullable, so wird das Ergebnis immer vom Type Nullable des "größeren" Typs sein (int? + long = long?, etc.).

Dies gibt auch schon einen Hinweis auf das Ergebnis unserer Multiplikation: das Ergebnis ist null, sobald auch nur eine Variable null ist.

Eine funktionierende Variante des oben angegebenen Codes könnte folgendermaßen aussehen, sofern die Variable c nicht in die Berechnung mit eingehen soll, wenn sie null ist:

   1: int? result = c.HasValue

   2:  ? (a * b * c.Value)

   3:  : (int?)(a * b);

Soll ein bestimmter Default-Wert verwendet werden, lässt sich dies folgendermaßen durchführen:

   1: int result = a * b * c.GetValueOrDefault(1);

Bei mathematischen Berechnung mit über Nullable gewrappten Datentypen ist somit Vorsicht geboten, um keine unerwarteten Werte zu erhalten.

Eine detaillierte Darstellung der Verarbeitung von Nullable-Typen findet sich hier.