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;
    }
}

Надеюсь это поможет.

Другие вопросы по тегам