CodeContracts: Wie in Ctor erforderlich erfüllen mit diesem () nennen?
-
19-09-2019 - |
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?
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