Debido a la opción de representación en tiempo de ejecución para System.Nullable<'T>
.
Nullable intenta representar la ausencia de valores por el puntero nulo, y presentar los valores por punteros a esos valores.
(new System.Nullable<int>() :> obj) = null
|> printfn "%b" // true
(new System.Nullable<int>(1) :> obj).GetType().Name
|> printfn "%s" // Int32
Considere las cadenas. Desafortunadamente, las cadenas son nulables. Así que esto es válido:
null : string
Pero ahora un valor null
tiempo de ejecución es ambigua - se puede hacer referencia a la ausencia de un valor o una presencia de un valor null
. Por esta razón, .NET no permite construir un System.Nullable<string>
.
Contraste esto con:
(Some (null : string) :> obj).GetType().Name
|> printfn "%s" // Option`1
Dicho, se puede definir una biyección:
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)
Si usted observa los tipos, estas funciones restringir 'T
a ser una estructura y tienen un constructor de cero argumentos Entonces, quizás el compilador F # podría exponer las funciones .NET que reciben/devuelven Nullable<'T>
sustituyéndolas por un Option<'T where 'T : struct and 'T : (new : unit -> 'T)>
, e insertando las funciones de conversión cuando sea necesario.
¿Y qué? Puede hacer ese requisito en el nivel de sintaxis de languge y seguir usando Nullable en el nivel de tiempo de ejecución. –
En el nivel de tiempo de ejecución, se representan utilizando valores nulos. – Robert
Lamentablemente está equivocado. No necesita verificar los tipos de opciones para ver si tienen un valor, simplemente puede llamar a la Opción .Value directamente y esperar que no obtenga una excepción. Ni siquiera hay una advertencia del compilador si no usa la coincidencia de patrones. –