基本上,我有一个虚拟方法来传播某些强制后置条件到子类。下面是一个简化版本和奇怪的警告静态检查生成(编辑 - 我的例子是不完整这是现在。):为什么CodeContracts静态检查器暗示我合同。假设(a)在合同签订之后。确保(a)?
public abstract class InitializerClass
{
protected bool _initialized
public bool IsInitialized
{
get { return _initialized; }
}
public virtual void Initialize()
{
//Warning CodeContracts: Missing precondition in an externally visible
//method. Consider adding Contract.Requires(this.IsInitialized); for
//parameter validation
Contract.Ensures(IsInitialized);
}
}
这是其他类:
public abstract class OrderingClass
{
protected bool _ordered
public bool IsOrdered
{
get { return _ordered; }
}
public override void Initialize()
{
//Message CodeContracts: Suggested assume: Contract.Assume(this.IsOrdered);
Contract.Ensures(IsOrdered);
}
}
其实
,这两个警告正指向方法的结束大括号,在Contract.Ensure调用的下面几行中。我的代码有什么问题?
我显然无法将'Contract.Requires(IsInitialized)'添加到'InitializerClass.Initialize'中,因为确保'IsInitialized'设置为true,因为后期条件是合同的要点。这些东西是相互排斥的。 'OrderingClass.Initialize'覆盖也是一样。我是否错过了一些东西,或者是静态检查器只是很困惑? – user2212990
实际上在代码中设置了_initialized为true的方法,对吧?最好加上它来清楚。 –
使用CodeContracts版本1.7.11202.10静态检查时,不管使用何种方法修复代码(除了Henk的评论:缺少半列,没有基类的重写),警告级别和选项都会启动。 – Stein