Contract.Requires 和 DateTime

Contract.Requires and DateTime

提问人:Patrick McDonald 提问时间:5/22/2011 最后编辑:Patrick McDonald 更新时间:5/23/2011 访问量:423

问:

我有以下方法:

private static void SampleMethod(DateTime dateTime1, DateTime dateTime2)
{
    Contract.Requires(dateTime1 > dateTime2);
    Console.WriteLine("date 1 > date 2");
}

SampleMethod(DateTime.Today, DateTime.Today.AddDays(1));

当我在启用静态检查的情况下构建它时,我收到警告CodeContracts: requires unproven: dateTime1 > dateTime2

请注意,动态检查对我来说工作正常,只是静态检查我有问题。

我该如何证明此断言,或者禁止显示警告?

编辑:

我正在阅读有关 ContractVerificationAttribute 的文章,如果我添加到该方法中,它没有任何区别(我怀疑这可能是一个错误),但是将其添加到类中将正确关闭整个类的静态检查。不过,我仍在寻找一种方法来关闭该静态检查。[ContractVefirication(false)

C# 日期时间 代码协定

评论

2赞 Damien_The_Unbeliever 5/22/2011
您向我们展示了包含合约的代码。当然,该消息来自调用代码 - 您尚未向我们展示。
0赞 Patrick McDonald 5/22/2011
公平地说,我已经为该方法添加了一个示例调用。无论方法如何调用,只要调用该方法,警告都是相同的。
0赞 ℍ ℍ 5/22/2011
您的样品未按合同执行,我将插入一个“-”。
0赞 Patrick McDonald 5/22/2011
该示例应该使合同失败,我希望上面的代码要么静态失败,要么不引发任何编译器警告并动态失败。
0赞 ℍ ℍ 5/23/2011
重新编辑:应将 ContractVerification 应用于调用类或方法。将其添加到 SampleMethod() 无济于事。但这个属性是一个白旗,表明你正在放弃合同。

答:

3赞 ℍ ℍ 5/22/2011 #1

静态验证器有其局限性,有时您必须提供帮助。它对数值数学的理解有限,但 DateTime 似乎超出了其范围。

这就是存在的原因:Contract.Assume(bool)

    DateTime d1 = DateTime.Today;  
    DateTime d2 = d1.AddDays(-7);

    Contract.Assume(d1 > d2);

    SampleMethod(d1, d2);

CodeContracts:已检查 4 个断言:4 个正确

评论

0赞 Patrick McDonald 5/22/2011
+1 谢谢 Henk,这有效,我现在只需要找到一种方法来避免在每次使用 Contract.Assume 调用该方法之前,因为它使测试变得太笨拙了
0赞 Timwi 5/22/2011
这难道不违背静态合同检查的目的吗?还不如在方法中放置一个运行时断言。
0赞 ℍ ℍ 5/23/2011
@Patrick,@timwi:就像我说的,这是验证器的限制。Requires 已经用作运行时断言,问题确实出在调用站点上。请注意,对于参数,这通常有效。int
0赞 Patrick McDonald 5/23/2011
我注意到在使用 ints 时很容易解决,我开始怀疑回到抛出 ArgumentExceptions 而不是在 DateTime 参数上使用合约可能要容易得多。