相关疑难解决方法(0)

我错误地实施了这个简单的合同吗?

这是我的代码:

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

}
Run Code Online (Sandbox Code Playgroud)

我尝试使用Contract.RequiresContract.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));
    }

}
Run Code Online (Sandbox Code Playgroud)

以上测试也通过,我无法弄清楚为什么!

起初我以为ReSharper可能会弄乱一些东西,因为它会在我尝试使用Contract命名空间中的方法时显示该行并显示此消息:

跳过方法调用.编译器不会生成方法调用,因为该方法是有条件的,或者是没有实现的部分方法.

但暂停R#并在NUnit中运行测试具有相同的结果,VS中也没有错误或警告.所以我认为这只是因为ReSharper还没有强调代码合同的兼容性.

我查看了文档,据我所知,我不应该遇到这个问题.

我是否正确使用代码合同或是我的环境阻止它以某种方式工作?

谢谢.

c# resharper design-by-contract visual-studio-2010 code-contracts

17
推荐指数
1
解决办法
5343
查看次数