Я буду использовать int
в качестве примера.
Контракт на int.CompareTo(int)
не гарантирует какого-либо конкретного возвращаемого значения. Вы знаете, что если a >= b
, то a.CompareTo(b) >= 0
, но, поскольку это не было выражено в качестве контракта, единственное, что видит статическая проверка, это "a.CompareTo (b) возвращает int".«Int» не может быть доказано, что оно неотрицательно.
Вы должны иметь возможность добавить что-то вроде
Contract.Assert(a >= b);
Contract.Assume(a.CompareTo(b) >= 0);
в тех местах, где вы вызываете свою функцию.Это позволяет статической проверке сначала попытаться доказать это a >= b
и уведомить вас, если она не может этого доказать, а затем доверять вам, что требование функции выполнено.
Если вы часто вызываете эту функцию для int
может быть целесообразно создать функцию-оболочку с этим измененным int
-конкретным контрактом:
public static bool IsBetween(this int value, int lowerBound, int upperBound)
{
Contract.Requires<>(value != null);
Contract.Requires<>(lowerBound != null);
Contract.Requires<>(upperBound != null);
Contract.Requires<>(upperBound >= lowerBound);
Contract.Assume(upperBound.CompareTo(lowerBound) >= 0);
return IsBetween<int>(value, lowerBound, upperBound);
}
и аналогично для других типов.