JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD012 : GeneratorPooledAsValue

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

Any.OneOf tire une valeur parmi un ensemble de valeurs. Alimenté avec des générateurs, il infère le type du constructeur comme type d’élément : l’ensemble contient des recettes, et y tirer produit une recette plutôt qu’une valeur — laquelle se propage ensuite vers les positions object et texte que signalent JD005 et JD011.

Ce qui en fait un piège plutôt qu’une bévue évidente, c’est l’incohérence de la surface. Any.OneOf(Any.Int32(), Any.Int64()) échoue à l’inférence de types et le compilateur vous arrête ; Any.OneOf(Any.Int32(), Any.Int32()) se lie proprement et ne dit rien.

Non conforme

IAny<AnyInt32> pool = Any.OneOf(Any.Int32().Positive(), Any.Int32().Negative());   // JD012
AnyInt32 drawn = pool.Generate();   // une recette, pas un nombre

Conforme

IAny<int> pool = Any.OneOf(Any.Int32().Positive().Generate(), Any.Int32().Negative().Generate());
int drawn = pool.Generate();

Notez ce que la forme conforme change : l’ensemble est construit avec empressement, un tirage par élément à la construction, et Generate() choisit ensuite parmi ces valeurs figées. C’est la sémantique documentée d’un ensemble de choix — si vous vouliez un tirage frais depuis un générateur choisi à chaque appel, c’est une autre intention et Any.OneOf n’est pas l’outil.

Ce qui n’est pas signalé

  • Un ensemble de valeurs ordinaires, ou de valeurs générées.
  • Un OneOf porté par un autre type qu’Any / AnyContext.
  • Un ensemble dont les générateurs ont des types différents — le compilateur le refuse déjà.

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