A causa della scelta della rappresentazione runtime per System.Nullable<'T>
.
Nullable tenta di rappresentare l'assenza di valori dal puntatore nullo e presenta i valori in base a tali valori.
(new System.Nullable<int>() :> obj) = null
|> printfn "%b" // true
(new System.Nullable<int>(1) :> obj).GetType().Name
|> printfn "%s" // Int32
Considerare ora le stringhe. Sfortunatamente, le stringhe sono annullabili. Quindi questo è valido:
null : string
Ma ora un valore di null
runtime è ambiguo - può riferirsi sia l'assenza di un valore o una presenza di un valore null
. Per questo motivo, .NET non consente di costruire un System.Nullable<string>
.
Contrasto questo con:
(Some (null : string) :> obj).GetType().Name
|> printfn "%s" // Option`1
Detto, si può definire una biiezione:
let optionOfNullable (a : System.Nullable<'T>) =
if a.HasValue then
Some a.Value
else
None
let nullableOfOption = function
| None -> new System.Nullable<_>()
| Some x -> new System.Nullable<_>(x)
Se si osservano i tipi, queste funzioni vincolare 'T
essere una struttura ed avere un costruttore di argomenti zero. Quindi, forse compilatore F # potrebbe esporre le funzioni .NET ricezione/ritorno Nullable<'T>
sostituendo per un Option<'T where 'T : struct and 'T : (new : unit -> 'T)>
, e inserendo le funzioni di conversione se necessario ..
E allora? È possibile soddisfare tale requisito con il livello di sintassi languge e utilizzare ancora Nullable a livello di runtime. –
A livello di runtime sono rappresentati utilizzando valori null. – Robert
Sfortunatamente ti sbagli. Non è necessario controllare i tipi di opzioni per vedere se hanno un valore, puoi semplicemente chiamare l'opzione. Valore direttamente e spero che tu non ottenga un'eccezione. Non c'è nemmeno un avviso del compilatore se non si utilizza la corrispondenza del modello. –