CodeContracts: Как выполнить Require в Ctor с помощью вызова this()?
Я играю с CodeContracts от Microsoft и столкнулся с проблемой, которую не смог решить. У меня есть класс с двумя конструкторами:
public Foo (public float f) {
Contracts.Require(f > 0);
}
public Foo (int i)
: this ((float)i)
{}
Пример упрощен. Я не знаю, как проверить второй конструктор f
для того, чтобы быть> 0. Это вообще возможно с Контрактами?
2 ответа
Решение
Вы можете просто добавить предусловие в тело второго конструктора.
public TestClass(float f)
{
Contract.Requires(f > 0);
throw new Exception("foo");
}
public TestClass(int i): this((float)i)
{
Contract.Requires(i > 0);
}
РЕДАКТИРОВАТЬ
Попробуйте вызвать код выше с помощью:
TestClass test2 = new TestClass((int)-1);
Вы увидите, что предварительное условие выбрасывается до того, как выдается обычное Исключение.
Я бы добавил статический метод, который конвертирует int в число с плавающей точкой и включает Contract.Requires
там.
class Foo
{
public Foo(float f)
{
Contract.Requires(f > 0);
}
public Foo(int i) : this(ToFloat(i))
{
}
private static float ToFloat(int i)
{
Contract.Requires(i > 0);
return i;
}
}
Надеюсь это поможет.