Frage

Ich spiele mit Microsofts CodeContracts um und stieß auf ein Problem, das ich lösen konnte nicht. Ich habe eine Klasse mit zwei Konstrukteuren bekommt:

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

Das Beispiel wird vereinfacht. Ich weiß nicht, wie der zweiten Konstruktor f prüfen> für seine 0. Ist dies überhaupt möglich mit Contracts?

War es hilfreich?

Lösung

Sie können nur die Voraussetzung für die zweite Konstruktor Körper hinzuzufügen.

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

Bearbeiten

Versuchen Sie den Code oben mit Aufruf:

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

Sie werden sehen, dass die Voraussetzung ausgegeben, bevor die reguläre Ausnahme ausgelöst wird.

Andere Tipps

Ich würde eine statische Methode hinzufügen, die int mit dem Schwimmer konvertiert und enthalten die Contract.Requires drin.

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

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top