CodeContracts: Como cumprir Exigir em ctor usando esta chamada ()?
-
19-09-2019 - |
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?
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