1

Microsoft の CodeContracts をいじっていて、解決できない問題に遭遇しました。2 つのコンストラクターを持つクラスがあります。

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

この例は簡略化されています。2 番目のコンストラクターが > 0 であることを確認する方法がわかりませんf。これはコントラクトでも可能ですか?

4

2 に答える 2

2

前提条件を 2 番目のコンストラクターの本体に追加するだけです。

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

編集

上記のコードを次のように呼び出してみてください。

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

通常の例外がスローされる前に前提条件がスローされることがわかります。

于 2010-06-18T12:18:23.920 に答える
1

int を float に変換する静的メソッドを追加しContract.Requires、そこに を含めます。

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

お役に立てれば。

于 2009-09-12T11:14:16.803 に答える