CodeContracts: come soddisfare Richiede in ctor utilizzare questo () chiamato?
-
19-09-2019 - |
Domanda
Sto giocando intorno con CodeContracts di Microsoft e riscontrato un problema non ero in grado di risolvere. Ho una classe con due costruttori:
public Foo (public float f) {
Contracts.Require(f > 0);
}
public Foo (int i)
: this ((float)i)
{}
L'esempio è semplificato. Non so come controllare f
del secondo costruttore per essere> 0. Questo è anche possibile con contratti?
Soluzione
Si può solo aggiungere il presupposto per il corpo del secondo costruttore.
public TestClass(float f)
{
Contract.Requires(f > 0);
throw new Exception("foo");
}
public TestClass(int i): this((float)i)
{
Contract.Requires(i > 0);
}
Modifica
Prova a chiamare il codice precedente con:
TestClass test2 = new TestClass((int)-1);
Si vedrà che la precondizione è gettato prima che l'eccezione regolare è gettato.
Altri suggerimenti
Vorrei aggiungere un metodo statico che converte l'int al galleggiante e includere il Contract.Requires
in 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;
}
}
Spero che questo aiuti.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow