Хорошо, у меня есть еще один вопрос с кодовым контрактом. У меня есть контракт на методе интерфейса, который выглядит следующим образом (другие методы опущены для ясности):Использование договора. Для всех кодовых контрактов
[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
требует не- нулевой входной параметр (он реализует интерфейс, который имеет контракт «Требуется контракт»), и поэтому я получаю «требуется недоказанная ошибка: group! = null» в подгруппе, передаваемой в AddRequested
. Я правильно использую синтаксис ForAll? Если это так, и решатель просто не понимает, есть ли другой способ помочь решателю признать контракт или мне просто нужно использовать Assume всякий раз, когда вызывается GetAllGroups()?
Последняя версия активировала 'ForAll', вы можете попробовать: – porges