好的,我还有另一个代码合同问题。我有一个接口方法的合同,看起来像这样(为清楚起见省略其它方法):在代码合同中使用Contract.ForAll
[ContractClassFor(typeof(IUnboundTagGroup))]
public abstract class ContractForIUnboundTagGroup : IUnboundTagGroup
{
public IUnboundTagGroup[] GetAllGroups()
{
Contract.Ensures(Contract.Result<IUnboundTagGroup[]>() != null);
Contract.Ensures(Contract.ForAll(Contract.Result<IUnboundTagGroup[]>(), g => g != null));
return null;
}
}
我有代码消耗看起来像这样的接口:
public void AddRequested(IUnboundTagGroup group)
{
foreach (IUnboundTagGroup subGroup in group.GetAllGroups())
{
AddRequested(subGroup);
}
//Other stuff omitted
}
AddRequested
需要非空输入参数(它实现了一个接口有一个需求合同),所以我得到一个'需要未经证实:组!=空'错误的子组被传递到AddRequested
。我是否正确使用ForAll语法?如果是这样,求解者根本不理解,还有另一种方法可以帮助求解器识别合同,或者每当调用GetAllGroups()时,我是否只需要使用Assume?
最新版本已启用'ForAll',你可能想试试:) – porges 2010-07-09 21:56:44