好的,我还有另一个代码合同问题。我有一个看起来像这样的接口方法的合同(为清楚起见,省略了其他方法):
[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
需要一个非空输入参数(它实现了一个具有 Requires 合同的接口),因此在传递到AddRequested
. 我是否正确使用了 ForAll 语法?如果是这样并且求解器根本不理解,是否有另一种方法可以帮助求解器识别合同,或者我是否只需要在调用 GetAllGroups() 时使用 Assume?