17

これは私のコードです:

public class RegularPolygon
{
    public int VertexCount;
    public double SideLength;

    public RegularPolygon(int vertexCount, double sideLength)
    {
        Contract.Requires(vertexCount >= 3);
        VertexCount = vertexCount;
        SideLength = sideLength;
    }

    [ContractInvariantMethod]
    private void RegularPolygonInvariants()
    {
        Contract.Invariant(VertexCount>=3);
    }

}

私はContract.RequiresメソッドとContract.Invariantメソッドの両方を試して、vertexCount変数が2以下になるのを防ぎました。ただし、2辺以下のRegularPolygonを初期化することはできます。私の(簡略化された)NUnitテストは次のようになります。

[TestFixture]
class TestRegularPolygon
{
    private RegularPolygon _polygon;

    [SetUp]
    public void Init()
    {
        _polygon = new RegularPolygon(1, 50);
    }

    [Test]
    public void Constructor()
    {
        Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3));
    }

}

上記のテストにも合格し、理由がわかりません。

最初は、ReSharperが何かを台無しにしていたのではないかと思いました。Contract名前空間でメソッドを使用しようとすると、行がグレー表示され、このメッセージが表示されるためです。

メソッドの呼び出しはスキップされます。メソッドが条件付きであるか、実装されていない部分的なメソッドであるため、コンパイラはメソッド呼び出しを生成しません。

ただし、R#を一時停止してNUnitでテストを実行しても同じ結果になり、VSでもエラーや警告は発生しません。つまり、ReSharperにはまだコードコントラクトの強調表示の互換性がないからだと思います。

私はドキュメントを見てきましたが、私が知る限り、この問題は発生してはいけません。

コードコントラクトを誤って使用していますか、それとも環境によってコードコントラクトが機能しなくなっていますか?

ありがとうございました。

4

1 に答える 1

19

最初に確認すること-実際に契約チェックをオンにしましたか?そうでない場合、どの契約も何もしません。それはR#警告も説明するでしょう。ビルドプロパティの「コードコントラクト」の下を見て、「ランタイムチェック」の下に何が表示されているかを確認します。

コメントCONTRACTS_FULLに従って、コンパイルシンボルとして定義されていることを確認してください。これはR#が必要としているように見えます。

2番目のポイント:パブリックな可変フィールドがあります。つまり、誰かが書いていることによって、いつでも不変条件に違反する可能性があります。

polygon.VertexCount = 0;

パブリックフィールド、特に書き込み可能なフィールドは使用しないでください。:)

于 2010-08-11T19:20:17.967 に答える