Programmation 101: si vous vous trouvez à répéter la même chose et plus, emballez pour la réutilisation, faites une fonction. Dans votre cas, la fonction serait générique (par exemple prendre paramètre de tout type) et faire le upcast sur le paramètre:
let pair name value = name, value :> obj
myfun [pair "Name" "Freddie"; pair "Age" 50]
Hmm ... Pas beaucoup plus agréable, est-il? Mais attendez, nous n'avons pas encore fini! Maintenant que vous avez cette fonction, vous pouvez lui donner un nom plus joli, ce qui rendrait l'appel plus agréable. Dites, ==>
:
let (==>) name value = name, value :> obj
myfun ["Name" ==> "Freddie"; "Age" ==> 50]
Si votre ensemble de types possibles est connu à l'avance et relativement faible (comme votre question semble indiquer), vous pouvez aller plus loin et avoir le contrôle du compilateur que seuls types autorisés sont utilisés . Pour ce faire, vous aurez besoin d'utiliser la méthode, les surcharges des contraintes de type statique résolus et une supercherie syntaxique:
type Casters() =
static member cast (v: string) = v :> obj
static member cast (v: float) = v :> obj
static member cast (v: int) = v :> obj
static member cast (v: string list) = v :> obj
static member cast (v: float list) = v :> obj
static member cast (v: int list) = v :> obj
let inline cast (casters: ^c) (value: ^t) =
((^c or ^t) : (static member cast : ^t -> obj) value)
let inline (==>) name value = name, (cast (Casters()) value)
["Name" ==> "Freddie"; "Age" ==> 50] // OK
["What?" ==> true] // Error: "bool" is not an allowed type
Merci, mais votre fonction _pair_ me donne _La la contrainte statique de type » a à « b implique un type indéterminé sur la base d'informations avant cette point_ du programme. Ne voyez-vous pas la même erreur? [tryfsharp] (http://www.tryfsharp.org/create/seankearon/file3.fsx) –
Une erreur. J'ai copié votre 'upcast' au lieu de l'opérateur de mise à jour approprié avec le type réel. Corrigé maintenant. –
C'est adorable, merci! –