Question

Chaque cas de syndicat en type union discriminé obtient un numéro de balise

type Result<'TSuccess,'TFailure> = 
   | Success of 'TSuccess
   | Failure of 'TFailure

let cases = FSharpType.GetUnionCases typedefof<Result<_,_>>
for case in cases do
    case.Tag

En regardant le code compilé, il est généré par compilateur et constant en fonction de l'ordre des cas.Alors le succès est 0 et l'échec est 1.

  • est le numéro de balise toujours généré en fonction de la commande?Est-ce dans les spécifications F #?
  • est-il possible de fournir un numéro de balise personnalisé, de sorte que si la commande change ou que je pose un autre cas au milieu, entre le succès et l'échec, leurs numéros de balises ne changent pas?

J'essaie de configurer Protobuf-net pour sérialiser un syndicat discriminé en créant un modèle de type personnalisé et en ajoutant du succès et de l'échec en tant que sous-types de résultat.Mais pour que cela fonctionne, il faut spécifier le pour chaque classe, qui doit rester constante.J'espérais automatiser la configuration, mais je devrais pouvoir disposer d'un numéro de chaque type et que ce relatinion ne change jamais.La balise semble être parfaite si elle peut être codée en dur dans la définition de l'Union discriminée.

Était-ce utile?

La solution

Nous pouvons simplement lire la spécification:

Si vous avez plus d'un cas, il possède un type CLI Netté de type U.tags.Le type U.TAGS contient un littéral entier pour chaque cas, dans une commande croissante à partir de zéro.

(Section 8.5.4)

Il semble donc que vous puissiez compter sur l'ordre des éléments, mais l'insertion de nouveaux éléments entraînera la création de nouveaux numéros.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top