【发布时间】:2013-06-30 07:39:51
【问题描述】:
基本上,我有一个虚拟方法可以将某些强制性后置条件传播到子类。这是一个简化版本和静态检查器生成的奇怪警告(编辑 - 我的示例不完整。现在):
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覆盖相同。我错过了什么还是静态检查器真的很困惑? -
方法里其实有代码设置_initialized为true吧?最好加上清楚。
-
使用 CodeContracts 版本 1.7.11202.10 静态检查不会产生这样的警告,警告级别和选项都会提高,无论我尝试如何修复代码(除了 Henk 的评论:缺少半列,覆盖没有基类)。
标签: c# inheritance abstract-class code-contracts post-conditions