Tipi valore nullable

Un tipo valore nullable rappresenta qualsiasi tipoNullable<'T> di struct che potrebbe anche essere null. Ciò è utile quando si interagisce con librerie e componenti che possono scegliere di rappresentare questi tipi di tipi, ad esempio numeri interi, con un null valore per motivi di efficienza. Il tipo sottostante che esegue il backup di questo costrutto è System.Nullable<T>.

Sintassi

Nullable<'T>
Nullable value

Dichiarare e assegnare con valori

La dichiarazione di un tipo valore nullable è simile alla dichiarazione di qualsiasi tipo wrapper in F#:

open System

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

È anche possibile eseguire l'elide del parametro di tipo generico e consentire l'inferenza del tipo per risolverlo:

open System

let x = 12
let nullableX = Nullable x

Per assegnare a un tipo di valore nullable, è necessario essere espliciti. Non esiste alcuna conversione implicita per i tipi di valore nullable definiti da F#:

open System

let mutable x = Nullable 12
x <- Nullable 13

Assegnare null

Non è possibile assegnare null direttamente a un tipo di valore nullable. Usare Nullable() invece:

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

Ciò è dovuto al fatto che Nullable<'T> non ha null come valore appropriato.

Passare e assegnare ai membri

Una differenza fondamentale tra l'uso dei membri e dei valori F# è che i tipi valore nullable possono essere dedotti in modo implicito quando si lavora con i membri. Si consideri il metodo seguente che accetta un tipo di valore nullable come input:

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

Nell'esempio precedente è possibile passare 12 al metodo M. È anche possibile assegnare 12 alla proprietà NVTautomatica . Se l'input può essere costruito come tipo valore nullable e corrisponde al tipo di destinazione, il compilatore F# convertirà in modo implicito tali chiamate o assegnazioni.

Esaminare un'istanza del tipo di valore nullable

A differenza di Options, che sono un costrutto generalizzato per rappresentare un valore possibile, i tipi valore nullable non vengono usati con criteri di ricerca. È invece necessario usare un'espressione if e controllare la HasValue proprietà .

Per ottenere il valore sottostante, usare la Value proprietà dopo un HasValue controllo, come illustrato di seguito:

open System

let a = Nullable 42

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

Operatori nullable

Le operazioni sui tipi valore nullable, ad esempio aritmetici o confronto, possono richiedere l'uso di operatori nullable.

È possibile eseguire la conversione da un tipo di valore nullable a un altro usando gli operatori di conversione dallo spazio dei FSharp.Linq nomi :

open System
open FSharp.Linq

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

È anche possibile usare un operatore non nullable appropriato per eseguire la conversione in un tipo primitivo, rischiando un'eccezione se non ha alcun valore:

open System
open FSharp.Linq

let nullableFloat = Nullable 10.0
let standardFloat = float nullableFloat

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

È anche possibile usare operatori nullable come breve per il controllo HasValue e 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

Il ?> confronto controlla se il lato sinistro è nullable e ha esito positivo solo se ha un valore. Equivale alla riga che la segue.

Vedi anche