これは私のコードです:
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にはまだコードコントラクトの強調表示の互換性がないからだと思います。
私はドキュメントを見てきましたが、私が知る限り、この問題は発生してはいけません。
コードコントラクトを誤って使用していますか、それとも環境によってコードコントラクトが機能しなくなっていますか?
ありがとうございました。