Sto utilizzando Code Contracts insieme al componente aggiuntivo Code Contracts Editor Extensions VS2010. Ho una classe che implementa l'interfaccia IEnumerable<T>
e ho implementato un blocco iteratore per il metodo GetEnumerator()
. Sopra di esso, posso vedere il seguente contratto ereditato:Contratti di codice: IEnumerator <T> .GetEnumerator() contratto ereditato strano?
Capisco il primo e il terzo requisito contratto - GetEnumerator()
deve mai restituire un nulla, e non deve mai causare un effetto collaterale. Ma cosa significa il secondo requisito del contratto? Che cos'è questa proprietà Model
di IEnumerator<T>
e di IEnumerable
?
EDIT: Come Damien_The_Unbeliever ha sottolineato nel suo commento, il contratto per IEnumerable<T>
e IEnumerator<T>
si trovano in un file separato, un Contratti Assemblea di riferimento. Utilizzando Reflector, nel disassemblaggio del contratto di questi due interfacce (il codice completo è here), è possibile vedere il seguente:
[return: Fresh]
[Escapes(true, false), Pure, GlobalAccess(false)]
public IEnumerator GetEnumerator()
{
IEnumerator enumerator;
Contract.Ensures((bool) (Contract.Result<IEnumerator>() != null), null, "Contract.Result<IEnumerator>() != null");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().Model == this.Model), null, "Contract.Result<IEnumerator>().Model == this.Model");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().CurrentIndex == -1), null, "Contract.Result<IEnumerator>().CurrentIndex == -1");
return enumerator;
}
È interessante notare che c'è un contratto aggiuntivo in GetEnumerator()
che non viene visualizzato l'editor extention:
Contract.Result<IEnumerator>().CurrentIndex == -1
e alcuni misteri additionaly (come i Fresh
, Escapes
e GlobalAccess
attributi).
Non posso aiutarti, ma grazie per avermi indirizzato verso alcune aree di interesse. I tipi 'IEnumerable' e' IEnumerable 'utilizzati dai contratti di codice vengono caricati da C: \ Programmi \ Microsoft \ Contracts \ Contracts \ .NETFramework \ v4.0 \ mscorlib.Contracts.dll (la posizione può variare) e queste versioni delle interfacce (e delle relative classi di contratto associate) hanno più membri delle interfacce "effettive" di mscorlib. Ma pur avendo letto le annotazioni del contratto, non ho idea di quale sia lo scopo del modello. –
@ Damiano: Grazie, ho modificato la domanda in base alle tue nuove informazioni. –
È che 'IEnumerator' restituisce il tipo nel contratto la vera interfaccia' IEnumerator' o una classe con lo stesso nome? Se è l'interfaccia, non capisco nemmeno perché compili. – CodesInChaos