Pergunta

Eu estou brincando com CodeContracts da Microsoft e se deparou com um problema que eu era incapaz de resolver. Eu tenho uma classe com dois construtores:

public Foo (public float f) {
    Contracts.Require(f > 0);
}
public Foo (int i)
    : this ((float)i)
{}

O exemplo é simplificado. Eu não sei como verificar f do segundo construtor para ser> 0. É isto mesmo possível com contratos?

Foi útil?

Solução

Você pode simplesmente adicionar a pré-condição para o corpo do segundo construtor.

public TestClass(float f)
{
    Contract.Requires(f > 0);
    throw new Exception("foo");
}
public TestClass(int i): this((float)i)
{
    Contract.Requires(i > 0);
}

Editar

Tente chamar o código acima com:

TestClass test2 = new TestClass((int)-1);

Você verá que a pré-condição é lançada antes da Exceção regular é lançada.

Outras dicas

Eu gostaria de acrescentar um método estático que converte o int para a bóia e incluem o Contract.Requires lá.

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

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top