Freigeben über


Auf NULL festlegbare Werttypen

Ein Nullwerttyp Nullable<'T> stellt einen beliebigen Strukturtyp dar, der auch sein nullkann. Das ist bei der Interaktion mit Bibliotheken und Komponenten nützlich, die solche Typen – z. B. ganze Zahlen – möglicherweise aus Effizienzgründen mit einem null-Wert darstellen. Der zugrunde liegende Typ, der dieses Konstrukt zurückgibt, ist System.Nullable<T>.

Syntax

Nullable<'T>
Nullable value

Deklarieren und Zuweisen mit Werten

Das Deklarieren eines Nullwerte zulassenden Typs entspricht dem Deklarieren eines beliebigen Wrapper-ähnlichen Typs in F#:

open System

let x = 12
let nullableX = Nullable<int> x

Zum Auflösen können Sie auch den generischen Typparameter ignorieren und den Typrückschluss zulassen:

open System

let x = 12
let nullableX = Nullable x

Zur Zuweisung zu einem Nullwerte zulassenden Typ muss die Deklaration explizit sein. Für Typen, die in F# definiert werden und Nullwerte zulassen, gibt es keine implizite Konvertierung:

open System

let mutable x = Nullable 12
x <- Nullable 13

Zuweisen von NULL

Sie können null nicht direkt einem Nullwerte zulassenden Typ zuweisen. Verwenden Sie stattdessen Nullable():

let mutable a = Nullable 42
a <- Nullable()

Das liegt daran, dass null für Nullable<'T> nicht als richtiger Wert vorhanden ist.

Übergeben an Member und Zuweisen zu Membern

Ein wichtiger Unterschied zwischen der Arbeit mit Membern und der Arbeit mit F#-Werten besteht darin, dass Nullwerte zulassende Typen implizit abgeleitet werden können, wenn Sie mit Membern arbeiten. Sehen Sie sich die folgende Methode an, die einen Nullwerte zulassenden Typ als Eingabe verwendet:

type C() =
    member _.M(x: Nullable<int>) = x.HasValue
    member val NVT = Nullable 12 with get, set

let c = C()
c.M(12)
c.NVT <- 12

Im vorherigen Beispiel können Sie 12 an die Methode M übergeben. Sie können 12 auch der automatischen Eigenschaft NVT zuweisen. Wenn die Eingabe als Nullwerte zulassender Typ erstellt werden kann und dem Zieltyp entspricht, konvertiert der F#-Compiler solche Aufrufe oder Zuweisungen implizit.

Untersuchen einer Instanz eines Nullwerte zulassenden Typs

Im Gegensatz zu Optionen, die ein generalisiertes Konstrukt für die Darstellung eines möglichen Werts sind, werden Nullwerte zulassende Typen nicht mit Musterabgleich verwendet. Stattdessen müssen Sie einen if-Ausdruck verwenden und die HasValue-Eigenschaft überprüfen.

Um den zugrunde liegenden Wert abzurufen, verwenden Sie die Value-Eigenschaft nach einer HasValue-Überprüfung wie folgt:

open System

let a = Nullable 42

if a.HasValue then
    printfn $"{a} is {a.Value}"
else
    printfn $"{a} has no value."

Operatoren, die NULL-Werte zulassen

Vorgänge mit Nullwerte zulassenden Werttypen, z. B. arithmetische Operationen oder Vergleichsvorgänge, können die Verwendung von Nullwerte zulassenden Operatoren erfordern.

Sie können einen Nullwerte zulassenden Typ in einen anderen konvertieren, indem Sie Konvertierungsoperatoren aus dem Namespace FSharp.Linq verwenden:

open System
open FSharp.Linq

let nullableInt = Nullable 10
let nullableFloat = Nullable.float nullableInt

Sie können auch einen geeigneten Operator verwenden, der keine Nullwerte zulässt, um in einen Grundtyp zu konvertieren und eine Ausnahme zu riskieren, wenn kein Wert vorhanden ist:

open System
open FSharp.Linq

let nullableFloat = Nullable 10.0
let standardFloat = float nullableFloat

printfn $"value is %f{float standardFloat}"

Sie können auch Nullwerte zulassende Operatoren als Kurzversion für die Überprüfung von HasValue und Value verwenden:

open System
open FSharp.Linq

let nullableInt = Nullable 10
let nullableFloat = Nullable.float nullableInt

let isBigger = nullableFloat ?> 1.0
let isBiggerLongForm = nullableFloat.HasValue && nullableFloat.Value > 1.0

Der ?>-Vergleich überprüft, ob die linke Seite Nullwerte zulässt, und ist nur erfolgreich, wenn ein Wert vorhanden ist. Dies entspricht der darauf folgenden Zeile.

Siehe auch