这是我的代码:
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 还没有突出代码合同的兼容性。
我查看了文档,据我所知,我不应该遇到这个问题。
我是在错误地使用代码合同,还是我的环境阻止了它以某种方式工作?
谢谢你。