Existe-t-il un moyen d'obtenir un type de valeur nulle? Cela ne fonctionne pas:Type de la valeur null utilisant F #
let a: string = null
let typ = a.GetType()
Merci
Existe-t-il un moyen d'obtenir un type de valeur nulle? Cela ne fonctionne pas:Type de la valeur null utilisant F #
let a: string = null
let typ = a.GetType()
Merci
let getStaticType<'T>(_x : 'T) = typeof<'T>
let a : string = null
let b : int[] = null
let typ1 = getStaticType a
let typ2 = getStaticType b
printfn "%A %A" typ1 typ2
// System.String System.Int32[]
Je ne suis pas sûr que ce soit la meilleure solution, mais vous pouvez utiliser Citations pour récupérer le type avec.
Par exemple:
let get_type x = <@ x @>.Type.FullName
Et test:
let a : string = null
let a' = get_type a
val a : string = null
val a' : string = "System.String"
let a : int[] = null
let a' = get_type a
val a : int [] = null
val a' : string = "System.Int32[]"
La solution par Brian fait probablement ce que vous avez besoin, mais vous ne devriez pas avoir besoin dans la pratique.
Type d'exécution - Si vous avez vraiment besoin de détecter le type de valeur lors de l'exécution (en utilisant GetType
) alors il est probablement parce que le type peut être plus précis que ce type statique suggère (il a été désérialisé ou créé en utilisant Reflection et vous avez une valeur de type obj
ou une interface). Dans ce cas, vous devez gérer null
explicitement, parce que getStaticType
vous donnera toujours obj
:
let handleAtRuntime (value:obj) =
match value with
| null -> // handle null
| _ -> let typ = value.GetType()
// do something using runtime-type information
type statique - Si vous avez juste besoin de connaître le System.Type
d'un type statiquement connu, alors vous devriez être capable d'écrire tout ce dont vous avez besoin en utilisant typeof<_>
. Ceci est utile lorsque vous avez des fonctions génériques:
let handleStatically (value:'T) =
let typ = typeof<'T>
// do something with the type (value still may be null)
Dans votre exemple, vous avez vraiment pas besoin de comportement dynamique, parce que vous pouvez être sûr que le type de la valeur est string
, vous pouvez utiliser la solution de Brian , mais en utilisant typeof<string>
serait bien aussi.
Je ne sais pas si cela est valide F #, mais il semble assez proche de ce que je m'attendais à voir donc +1 lol –
Nice. Vous pouvez également supprimer la valeur d'entrée au lieu de la lier à _x. 'let getStaticType (_: 'T) = type de <'T>'. – cfern
Merci. C'est ce dont j'avais besoin! –