OK, ho ancora un'altra domanda sui contratti di codice. Ho un contratto su un metodo di interfaccia che assomiglia a questo (altri metodi omessi per chiarezza):Utilizzo di Contract.ForAll nei contratti di codice
[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;
}
}
Ho codice consumando l'interfaccia che assomiglia a questo:
public void AddRequested(IUnboundTagGroup group)
{
foreach (IUnboundTagGroup subGroup in group.GetAllGroups())
{
AddRequested(subGroup);
}
//Other stuff omitted
}
AddRequested
richiede un non- parametro input null (implementa un'interfaccia che ha un contratto Requires) e quindi ottengo un errore 'require unproven: group! = null' sul sottogruppo passato a AddRequested
. Sto usando correttamente la sintassi ForAll? Se è così e il risolutore semplicemente non sta capendo, c'è un altro modo per aiutare il risolutore a riconoscere il contratto o semplicemente ho bisogno di usare un Assume ogni volta che viene chiamato GetAllGroups()?
L'ultima versione ha abilitato 'ForAll', si potrebbe voler fare un tentativo :) – porges