C# 合同。要求和日期时间

C# 合同。要求和日期时间,c#,datetime,code-contracts,C#,Datetime,Code Contracts,我有以下方法: 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)); 当我在启用静态检查的情况

我有以下方法:

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

请注意,动态检查对我来说很好,只是静态检查有问题

我该如何证明这一断言,还是压制这一警告

编辑:


我在读关于的,如果我在方法中添加
[ContractveFirification(false)
,它没有什么区别(我怀疑这可能是一个bug)但是,将它添加到类中将正确关闭整个类的静态检查。不过,我仍在寻找一种方法来关闭该类所需的静态检查。

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

这就是为什么
合同。假设(bool)
存在:

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

    Contract.Assume(d1 > d2);

    SampleMethod(d1, d2);
CodeContracts:已检查4个断言:4个正确


您正在向我们显示包含契约的代码。当然,该消息是由调用代码产生的,而您没有向我们显示该代码。公平地说,我已向该方法添加了一个示例调用。警告是相同的,无论该方法如何调用,只要它被调用。您的示例未通过契约,我将插入一个“-”。该示例应如果契约失败,我希望上面的代码要么静态失败,要么不引发任何编译器警告,而是动态失败。重新编辑:契约验证应应用于调用类或方法。将其添加到SampleMethod()中没有帮助。但是这个属性是一个白旗,表示您放弃了合同。+1谢谢Henk,这很有效,我现在只需要找到一种方法,避免在每次调用方法之前都使用合同。假设,因为这会使测试变得太难,这不是违背了静态合同检查的目的吗?最好放一个runti方法中的me断言。@Patrick,@timwi:正如我所说,这是验证器的一个限制。Requires已经用作运行时断言,问题确实是调用站点。请注意,对于
int
参数,这通常是有效的。我注意到在使用ints时很容易处理,我开始怀疑它是无效的返回到抛出异常,而不是在DateTime参数上使用契约,可能会容易得多。