JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD017 : EnumUniverseViolation

PropriétéValeur
CatégorieContraintes (JustDummies.Constraints)
Sévérité🟠 Avertissement
Activée par défautOui

Any.Enum<TEnum>() ne produit jamais qu’une valeur que TEnum définit : l’un de ses membres déclarés, ou — sur un enum [Flags], où OneOf accepte une combinaison pour elle-même — un OU de membres déclarés. Il n’invente jamais une valeur numérique non déclarée, même si le CLR vous laisserait l’écrire.

Nommer une valeur en dehors de cela n’est pas un rétrécissement qui se trouve être vide, c’est une erreur de catégorie. Une exclusion qui retire toutes les valeurs restant à tirer est la même erreur vue de l’autre côté.

Non conforme

Any.Enum<Permissions>().OneOf((Permissions)16)   // aucun OU de membres déclarés ne produit 16
Any.Enum<Day>().OneOf((Day)99)                   // pas un membre déclaré du tout
Any.Enum<Day>().OneOf((Day)3)                    // Day n'a jamais dit que ses membres se combinaient
Any.Enum<Day>().Except(Day.Mon, Day.Tue)         // il ne reste rien à tirer

Conforme

Any.Enum<Permissions>().OneOf(Permissions.Read | Permissions.Write)   // écrire une combinaison, c'est la demander
Any.Enum<Permissions>().AllowingCombinations()                        // un tirage ordinaire les parcourt une fois demandé
Any.Enum<Permissions>().OneOf(Permissions.Read, Permissions.Write)
Any.Enum<Day>().Except(Day.Mon)

Pourquoi elle est séparée des autres règles de contraintes

Son domaine relève des métadonnées — ce que le type déclare — et non de l’arithmétique d’intervalles, et sa faute a son propre modèle à enseigner : une valeur que le type ne définit pas n’est pas un rétrécissement qui se trouve être vide, c’est une erreur de catégorie. C’est aussi ce qui dit à la règle où s’arrêter. [Flags] est une métadonnée qui déclare que les membres se combinent : Read | Write est donc une valeur que le type définit sans jamais la déclarer — et la règle y suit le générateur, plutôt que de lire « déclaré » sur la seule liste des membres.

Ce qui n’est pas signalé

  • Une combinaison de membres déclarés nommée dans OneOf sur un enum [Flags] — avec AllowingCombinations(), sans lui, dans l’un ou l’autre ordre. Une liste blanche est le vivier : y écrire une combinaison, c’est demander cette valeur exacte, et le générateur la tire.
  • Toute contrainte dès lors qu’AllowingCombinations() est déclaré — y compris une exclusion qui retire tous les membres déclarés. Cela élargit l’univers à la clôture par OU des membres déclarés, qui ne correspond plus un à un à une valeur déclarée : la règle renonce plutôt que d’approximer — Except(Read, Write) à côté laisse encore Read | Write à tirer, et le générateur le tire.
  • Une exclusion qui retire tous les membres déclarés alors que la liste blanche nomme une valeur qu’aucune exclusion ne porte. Ce qui tranche, c’est qu’il survive quelque chose de ce que l’appelant a autorisé, non que l’ensemble déclaré ait été vidé.
  • Une exclusion qui retire tous les membres déclarés alors que la liste blanche contient une entrée que la règle ne sait pas lire — une variable, un champ, tout sauf une constante. Une liste blanche est le vivier : une entrée illisible en fait un vivier indécidable, non un vivier absent, et sur un enum [Flags] elle peut porter une combinaison qu’aucune exclusion ne nomme.
  • Un utilitaire générique dont l’argument de type est un paramètre de type non substitué — il n’y a aucun enum sur lequel raisonner, et la règle s’abstient plutôt que de deviner.
  • Une valeur non constante, ou une exclusion partielle qui laisse au moins un membre.
  • Un test négatif vérifiant un conflit.

Lire la source, ou la corriger là-bas ouvre un nouvel onglet· Repris depuis lib-v1.0.0-preview.6