Typy hodnot s povolenou hodnotou Null

Typ Nullable<'T> hodnoty null představuje libovolný typ struktury, který může být nulltaké . To je užitečné při interakci s knihovnami a komponentami, které se můžou rozhodnout tyto typy typů, jako jsou celá čísla, s null hodnotou z důvodů efektivity. Základní typ, který tento konstruktor zálohuje, je System.Nullable<T>.

Syntaxe

Nullable<'T>
Nullable value

Deklarace a přiřazení pomocí hodnot

Deklarování typu hodnoty null je stejně jako deklarování jakéhokoli typu podobného obálky v jazyce F#:

open System

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

Můžete také elidovat parametr obecného typu a povolit odvození typu, aby ho vyřešil:

open System

let x = 12
let nullableX = Nullable x

Pokud chcete přiřadit k typu hodnoty s možnou hodnotou null, musíte být také explicitní. Neexistuje žádný implicitní převod pro typy hodnot s možnou hodnotou null definovaných jazykem F#:

open System

let mutable x = Nullable 12
x <- Nullable 13

Přiřadit hodnotu null

Nelze přímo přiřadit null k typu hodnoty s možnou hodnotou null. Místo toho použijte Nullable() :

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

Je to proto, že Nullable<'T> nemá null správnou hodnotu.

Předání a přiřazení členům

Klíčovým rozdílem mezi prací se členy a hodnotami F# je to, že typy hodnot s možnou hodnotou null lze implicitně odvodit při práci s členy. Vezměte v úvahu následující metodu, která jako vstup přebírá typ hodnoty nullable:

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

V předchozím příkladu můžete předat 12 metodě M. Můžete také přiřadit 12 k automatické vlastnosti NVT. Pokud lze vstup vytvořit jako typ hodnoty s možnou hodnotou null a odpovídá cílovému typu, kompilátor jazyka F# implicitně převede taková volání nebo přiřazení.

Prozkoumání instance typu hodnoty s možnou hodnotou null

Na rozdíl od možnosti, což je generalizovaný konstruktor pro reprezentaci možné hodnoty, typy hodnot null nelze použít s porovnávání vzorů. Místo toho musíte použít if výraz a zkontrolovat HasValue vlastnost.

Pokud chcete získat podkladovou hodnotu, použijte Value vlastnost po HasValue kontrole, například takto:

open System

let a = Nullable 42

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

Operátory s možnou hodnotou null

Operace s typy hodnot s možnou hodnotou null, jako jsou aritmetické nebo porovnání, mohou vyžadovat použití operátorů s možnou hodnotou null.

Pomocí operátorů převodu z oboru názvů můžete převést z jednoho typu hodnoty s možnou FSharp.Linq hodnotou null na jiný:

open System
open FSharp.Linq

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

K převodu na primitivní typ můžete použít také vhodný operátor bez hodnoty null, který riskuje výjimku, pokud nemá žádnou hodnotu:

open System
open FSharp.Linq

let nullableFloat = Nullable 10.0
let standardFloat = float nullableFloat

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

Operátory s možnou hodnotou null můžete použít také jako stručnou kontrolu HasValue a Value:

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

Porovnání ?> zkontroluje, jestli je levá strana s možnou hodnotou null a bude úspěšná, pouze pokud má hodnotu. Je ekvivalentní řádku, který následuje za ním.

Viz také