Estoy usando Code Contracts junto con el complemento Code Contracts Editor Extensions VS2010. Tengo una clase que implementa la interfaz IEnumerable<T>
, y he implementado un bloque iterador para el método GetEnumerator()
. Por encima de él, puedo ver el siguiente contrato heredado:Contratos de código: IEnumerator <T> .GetEnumerator() raro contrato heredado?
entiendo el primer y tercer requisito contrato - GetEnumerator()
nunca debe devolver un valor nulo, y nunca deben causar un efecto secundario. ¿Pero qué significa el segundo requisito de contrato? ¿Qué es esto Model
propiedad de IEnumerator<T>
y de IEnumerable
?
EDIT: Como Damien_The_Unbeliever señaló en su comentario, el contrato para IEnumerable<T>
y IEnumerator<T>
se encuentran en un archivo separado, un conjunto de referencia contratos. Usando Reflector, en el desmontaje del contrato de esas dos interfaces (el código completo es here), se puede ver lo siguiente:
[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;
}
Curiosamente, hay un contrato adicional en GetEnumerator()
que no se visualiza por el editor extensión:
Contract.Result<IEnumerator>().CurrentIndex == -1
y algunos misterios adicionados (tales como los Fresh
, Escapes
GlobalAccess
y atributos).
No puedo ayudarte, pero gracias por indicarme algunas áreas de interés. Los tipos 'IEnumerable' y' IEnumerable 'utilizados por los contratos de código se cargan desde C: \ Archivos de programa \ Microsoft \ Contracts \ Contracts \ .NETFramework \ v4.0 \ mscorlib.Contracts.dll (la ubicación puede variar), y estas versiones de las interfaces (y sus clases contractuales asociadas) tienen más miembros que las interfaces "reales" de mscorlib. Pero incluso después de leer las anotaciones del contrato, no tengo idea de cuál es el propósito de Model. –
@Damien: Gracias, he editado la pregunta según su nueva información. –
¿Es ese tipo de devolución de 'IEnumerator' en el contrato la interfaz real' IEnumerator' o una clase con el mismo nombre? Si es la interfaz, ni siquiera entiendo por qué se compila. – CodesInChaos