2010-09-02 10 views
5

Llamo a funciones en el marco XNA desde F # que aceptan valores Nullable. Ahora, en C#, usted acaba de llamar:Nullablle <> y "nulo" en F #

foo(arg1, arg2, null, arg4) 

Ahora, he intentado que en Fa #, pero no le gusta. Dice: "Error 9 No coincide con la restricción. El tipo 'a no es compatible con el tipo System.Nullable. El tipo' System.Nullable 'no tiene' null 'como valor apropiado."

Entiendo por qué sucede esto, más o menos, pero parece realmente inconveniente. Todo lo que estoy haciendo ahora es hacer la vida más fácil, en lugar de escribir (Nullable<Rectangle>)null repetidamente cada vez que llamo a la función, acabo de hacer let nullRect = (Nullable<Rectangle>)null, y uso nullRect. Esto parece realmente estúpido, especialmente porque tendré que hacer eso para cada tipo de nullable con el que interactúo. ¿Hay una manera mejor y más idiomática de manejar esto?

Respuesta

3

Esto es lo que haría:

[<GeneralizableValue>] 
let nl<'a when 'a : struct 
      and 'a : (new : unit -> 'a) 
      and 'a :> System.ValueType> : System.Nullable<'a> = 
    unbox null 

Ahora puede utilizar nl donde quiera que habría utilizado null antes.

EDITAR

Como señala Tomás, esto se puede escribir mucho más concisa:

let nl = System.Nullable<_>() 
+1

Como nota al margen, esto se puede simplificar a '[] let nl = System.Nullable <_>()'. F # puede inferir el resto de la firma. –

+0

¡Eso es realmente bueno! No he tenido la oportunidad de probar la abreviatura de Tomas todavía. ¡Gracias por la sugerencia! – Perrako

+0

@Tomas - buena captura, es mucho más bonita. – kvb

3

Si no desea utilizar la respuesta muy inteligente de kvb, en muchos casos se puede omitir el tipo específico y solo usa Nullable<_>() - F # puede inferir qué tipo de Nullable quieres decir.

Cuestiones relacionadas