Я попробовал ваш пример и попытался свести его к самому простому примеру.
Кажется, что может быть несколько проблем, но вот пример, который, я думаю, может проиллюстрировать одну большую проблему:
public static void TestMethod()
{
double d = MethodReturningDouble();
Contract.Assert(d >= 0.0);
Contract.Assert(d <= 4.0);
}
public static double MethodReturningDouble()
{
// Contract.Ensures(Contract.Result<double>() <= 4.0); // <- without this line the above asserts are unproven
return 3.0;
}
Без спецификации контракта кода для вызываемых методов статическая проверка / анализатор, кажется, не в состоянии решить что-либо еще. MethodReturningDouble () возвращает константу, и статическому контролеру не удается определить, что утверждение всегда будет проходить.
В заключение, кажется, что статический анализатор ТОЛЬКО для спецификаций контрактов кода, а не для общего анализа.
Можно добавить предположения о методах, которые вы вызываете (для которых не определены контракты):
Например:
public static void TestMethodUsingRandom()
{
double d = new Random().NextDouble();
Contract.Assume(d <= 1.0);
Contract.Assert(d >= 0.0);
Contract.Assert(d <= 4.0);
}
Это допустимо, если вы точно знаете, что определенный метод ведет себя определенным образом.