(Również posted on the MSDN forum - ale to nie dostać dużo ruchu, o ile mogę zobaczyć.)Czy sprawdzanie statyczne Code Contracts może sprawdzać powiązanie arytmetyczne?
Próbowałem dostarczyć przykład Assert
i Assume
. Oto kod mam:
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;
}
(Segment o byciu w stanie przejść w null odniesienia zamiast istniejącego Random
odniesienia jest czysto pedagogicznej, oczywiście.)
Miałem nadzieję, że jeśli kontroler wiedział, że każdy z nich w zakresie [1, 6]
był w stanie obliczyć, że suma była w zakresie [2, 12]
.
Czy to nieracjonalna nadzieja? Rozumiem, że to trudny biznes, dokładnie to, co może się wydarzyć, ale miałem nadzieję, że kontroler będzie wystarczająco sprytny :)
Jeśli to nie jest teraz obsługiwane, czy ktoś tutaj wie, czy prawdopodobnie będzie obsługiwane w najbliższą przyszłość?
EDYCJA: Odkryłem, że są bardzo skomplikowane opcje arytmetyczne w statycznym sprawdzeniu. Korzystając z "zaawansowanego" pola tekstowego, mogę je wypróbować z Visual Studio, ale nie da się wytłumaczyć tego, co robią, o ile wiem.
Jon, czy próbowałeś skontaktować się bezpośrednio z chłopakami z DevLabs? Lista członków zespołu znajduje się na dole tej strony: http://research.microsoft.com/en-us/projects/contracts/ –
. Ich adres e-mail to codconfb _at_ microsoft _dot_ com (jak wspomniano na stronie ta sama strona). Byłbym zainteresowany poznaniem odpowiedzi na twoje pytanie. –
Myślałem, że byłoby trochę bardziej uprzejmie zadawać pytania na forum ... jeśli nie będę słyszał z powrotem na forach lub tutaj, zapytam też przez e-mail. –