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参数上使用契约,可能会容易得多。