## 7.9 Nullable-Typen Angenommen, Sie greifen auf das Feld einer Tabelle in einer Datenbank zu. Der Datentyp des Feldes sei ein Integer. Damit ist der zulässige Wertebereich eines initialisierten Feldes bereits exakt beschrieben, der zwischen dem Minimal- und dem Maximalwert des Typs liegt. Spalten einer Datenbanktabelle müssen aber nicht zwangsläufig mit einem durch den Datentyp beschriebenen Wert gefüllt sein, sie dürfen auch leer bleiben (NULL) und werden trotzdem als gültig anerkannt. In diesem Fall ist neben einem Zahlenwert auch null ein akzeptierter Inhalt. Das steht aber im Gegensatz zu der Vorgabe, dass ein Integer nicht durch null repräsentiert werden kann. Probleme dieser Art können nun ganz einfach durch Nullable-Typen gelöst werden. Dabei spielt System.Nullable<T> die entscheidende Rolle. Die Signatur deutet bereits an, dass der Typ Generics benutzt. Dabei wird einem Datentyp die Verwendung von null ermöglicht. Das macht nur Sinn, wenn es sich bei dem Datentyp um einen Typ handelt, der den Wertetypen zugerechnet wird, denn Referenztypen unterstützen grundsätzlich null. Die Definition lautet wie folgt:
    public struct Nullable<T> where T : struct
Nullable<T> ist also als Struktur definiert und schränkt die Verwendung auch selbst auf Strukturen ein und akzeptiert keine Referenztypen. Nullable<> kann beispielsweise wie folgt verwendet werden:
    Nullable<int> x = 4711;
    Nullable<int> y = null;
C# verfügt darüber hinaus auch über eine eigene Sprachsyntax. Dafür wurde der neue Modifizierer ? eingeführt, der aus einem Datentyp einen null-fähigen Typ macht. Damit kann die Notation der beiden Anweisungen auch vereinfachend wie folgt lauten:
    int? x = 4711;
    int? y = null;
Da wir es jetzt mit einem neuen Datentyp zu tun haben, der auch null unterstützt, wird in der Klasse Nullable mit HasValues eine Eigenschaft angeboten, die einen booleschen Wert beschreibt. Er ist true, wenn der Inhalt der null-fähigen Variable einen gültigen Wert aufweist, also ungleich null ist.
    if (x.HasValue)
      Console.WriteLine("Der Wert ist ungleich null");
    else
      Console.WriteLine("Der Wert ist null");
Die Ausgabe würde hier demnach lauten: Der Wert ist ungleich null. Der Inhalt der Variablen kann mit der Eigenschaft Value abgefragt werden. Sie liefert einen gültigen Wert, wenn HasValue true ist. Ansonsten wird eine Ausnahme vom Typ InvalidOperationException ausgelöst. Darüber hinaus können Sie Nullable-Typen auch in der üblichen Form eines Referenztyps verwenden und beispielsweise mit null vergleichen:
    if(x != null) {
      ...
    }
#### Konvertierungen mit Nullable-Typen Ein Nullable-Typ ist gegenüber seinem zugrunde liegenden Datentyp um die Fähigkeit erweitert worden, auch null zu unterstützen. Eine Zuweisung wie im folgenden Codefragment kommt einer aufweitenden Operation gleich und wird daher implizit vorgenommen.
    int x = 20;
    int? y = x;
Soll im umgekehrten Fall die Zuweisung eines null-fähigen Typs an seinen elementaren Typ erfolgen, muss explizit konvertiert werden.
    int? x = 20;
    int y = (int)x;