(Aussi posté sur le forum MSDN - mais qui n'est pas très fréquenté, d'après ce que je peux voir).
J'ai essayé de fournir un exemple de Assert
y Assume
. Voici le code que j'ai :
public static int RollDice(Random rng)
{
Contract.Ensures(Contract.Result<int>() >= 2 &&
Contract.Result<int>() <= 12);
if (rng == null)
{
rng = new Random();
}
Contract.Assert(rng != null);
int firstRoll = rng.Next(1, 7);
Contract.Assume(firstRoll >= 1 && firstRoll <= 6);
int secondRoll = rng.Next(1, 7);
Contract.Assume(secondRoll >= 1 && secondRoll <= 6);
return firstRoll + secondRoll;
}
(La possibilité de transmettre une référence nulle au lieu d'une référence existante). Random
La référence est purement pédagogique, bien sûr).
J'avais espéré que si le vérificateur savait que firstRoll
y secondRoll
étaient chacun dans l'intervalle [1, 6]
il serait en mesure de déterminer que la somme est comprise dans la fourchette suivante [2, 12]
.
Est-ce un espoir déraisonnable ? Je me rends compte que c'est une affaire délicate, de déterminer exactement ce qui pourrait arriver... mais j'espérais que le vérificateur serait assez intelligent :)
Si ce n'est pas supporté maintenant, est-ce que quelqu'un ici sait si cela va être supporté dans un futur proche ?
EDIT : Je viens de découvrir qu'il existe des options très compliquées pour l'arithmétique dans le vérificateur statique. En utilisant la zone de texte "advanced", je peux les essayer à partir de Visual Studio, mais il n'y a aucune explication décente de ce qu'elles font, pour autant que je puisse dire.