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?

È stato utile?

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
scroll top