È stato utile?

Soluzione

Ho avuto una risposta sul forum di MSDN. Si scopre che ero quasi lì. In sostanza il controllo statico funziona meglio se si divide out "e-ed" contratti. Quindi, se cambiamo il codice a questo:

public static int RollDice(Random rng)
{
    Contract.Ensures(Contract.Result<int>() >= 2);
    Contract.Ensures(Contract.Result<int>() <= 12);

    if (rng == null)
    {
        rng = new Random();
    }
    Contract.Assert(rng != null);

    int firstRoll = rng.Next(1, 7);
    Contract.Assume(firstRoll >= 1);
    Contract.Assume(firstRoll <= 6);
    int secondRoll = rng.Next(1, 7);
    Contract.Assume(secondRoll >= 1);
    Contract.Assume(secondRoll <= 6);

    return firstRoll + secondRoll;
}

che funziona senza problemi. Significa anche l'esempio è ancora più utile, come evidenzia il punto stesso che il correttore non lavoro meglio con contratti separati fuori.

Altri suggerimenti

Non so circa la MS Contratti strumento Controllo, ma l'analisi Range è una tecnica di analisi statica di serie; è ampiamente usato in strumenti di analisi statica commerciali per verificare che le espressioni pedice sono legali.

MS La ricerca ha un buon track record in questo tipo di analisi statica, e quindi mi aspetto di fare questo tipo di analisi gamma ad essere un obiettivo dei contratti Checker, anche se non attualmente selezionata.

scroll top