我正在尝试对我来说,似乎是一些相当基本的代码合同代码。我把它减少到了下面的问题。以下内容未通过静态分析,并显示消息
CodeContracts:确保未经证实: this.Frozen
using System;
using System.Diagnostics.Contracts;
namespace PlayAreaCollection2010
{
public class StrippedContract : IBasic
{
private bool _frozen = false;
public void Freeze()
{
_frozen = true;
}
public bool Frozen { get { return _frozen; } }
}
[ContractClass(typeof(IBasicContract))]
public interface IBasic
{
void Freeze();
bool Frozen { get; }
}
[ContractClassFor(typeof(IBasic))]
public abstract class IBasicContract : IBasic
{
#region IBasic Members
public void Freeze()
{
Contract.Ensures(this.Frozen);
}
public bool Frozen
{
get { return true;}
}
#endregion
}
}
但是,以下工作正常并且满足所有检查:
using System;
using System.Diagnostics.Contracts;
namespace PlayAreaCollection2010
{
public class StrippedContract
{
private bool _frozen = false;
public void Freeze()
{
Contract.Ensures(this.Frozen);
_frozen = true;
}
public bool Frozen { get { return _frozen; } }
}
}
CodeContracts:检查1个断言:1个正确
当我将合同放在界面中时,我需要做些什么来满足静态检查器?
答案 0 :(得分:3)
在IBasic
,StrippedContract
的实施中,您需要在Frozen
属性中添加后置条件:
public bool Frozen {
get {
Contract.Ensures(Contract.Result<bool>() == this._frozen);
return _frozen;
}
}
或者,您可以将-infer
命令行选项添加到项目属性的“代码约定”选项卡中的静态检查器中。这将允许静态检查器自动推断它。