(anche posted on the MSDN forum - ma questo non ottiene molto traffico, per quanto posso vedere.)Il controllore statico dei contratti con codice può controllare il limite aritmetico?
ho cercato di fornire un esempio di Assert
e Assume
. Ecco il codice che ho:
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;
}
(Il business di essere in grado di passare in un riferimento null invece di un Random
riferimento esistente è puramente pedagogica, naturalmente.)
avevo sperato che se il correttore sapeva che firstRoll
e secondRoll
erano ciascuno nell'intervallo [1, 6]
, sarebbe stato in grado di calcolare che la somma era nell'intervallo [2, 12]
.
È una speranza irragionevole? Mi rendo conto che è un affare complicato, che funziona esattamente cosa potrebbe accadere ... ma speravo che il correttore sarebbe stato abbastanza furbo :)
Se questo non è supportato ora, qualcuno sa se è probabile che sia supportato nel prossimo futuro?
EDIT: Ho trovato ora che ci sono opzioni molto complicate per l'aritmetica nel correttore statico. Usando la casella di testo "avanzata" posso provarli da Visual Studio, ma non c'è una spiegazione decente di quello che fanno, per quanto posso dire.
Jon, hai provato a contattare direttamente i ragazzi di DevLabs? Troverete i membri del team elencati in fondo a questa pagina: http://research.microsoft.com/en-us/projects/contracts/ –
E il loro indirizzo e-mail è codconfb _at_ microsoft _dot_ com (come menzionato sul stessa pagina). Sarei interessato a conoscere la risposta alla tua domanda. –
Ho pensato che sarebbe stato un po 'più educato fare domande prima nel forum ... se non avessi notizie sui forum o qui, lo chiederò anche via email. –