Code Contracts을 Code Contracts Editor Extensions VS2010 추가 기능과 함께 사용하고 있습니다. IEnumerable<T>
인터페이스를 구현하는 클래스가 있고 GetEnumerator()
메서드에 대한 반복기 블록을 구현했습니다. GetEnumerator()
가 널을 반환해서는 안, 그리고 부작용을 야기해서는 안 - 코드 계약 : IEnumerator <T> .GetEnumerator() weird 상속 된 계약?
Model
속성은
IEnumerator<T>
이고
IEnumerable
은 무엇입니까?
편집 : Damien_The_Unbeliever으로 자신의 의견에서 지적은, IEnumerable<T>
및 IEnumerator<T>
에 대한 계약은 계약 참조 어셈블리, 별도의 파일에 있습니다. 에디터에 의해 표시되지 않습니다 GetEnumerator()
의 추가 계약이있다, 흥미롭게도
[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;
}
: (전체 코드가 here입니다) 두 인터페이스의 계약의 분해에, Reflector를 사용하여 다음 볼 수 있습니다 확장자 :
Contract.Result<IEnumerator>().CurrentIndex == -1
그리고 (예 : Fresh
, Escapes
및 GlobalAccess
속성 등) 일부 additionaly 신비.
나는 당신을 도울 수 없지만, 관심있는 분야를 가르쳐 주셔서 감사합니다. 코드 계약에 사용되는 'IEnumerable'과 'IEnumerable'유형은 C : \ Program Files \ Microsoft \ Contracts \ Contracts \ .NETFramework \ v4.0 \ mscorlib.Contracts.dll (위치가 다를 수 있음)에서로드되며 이러한 버전 인터페이스 (및 관련 계약 클래스)에는 mscorlib의 "실제"인터페이스보다 많은 구성원이 있습니다. 그러나 계약 주석을 읽었을지라도 모델의 목적이 무엇인지 전혀 알지 못합니다. –
@Damien : 감사합니다. 귀하의 새로운 정보마다 질문을 편집했습니다. –
그'IEnumerator'는 실제'IEnumerator' 인터페이스 나 같은 이름을 가진 클래스의 형식을 반환합니까? 그것이 인터페이스라면 나는 그것이 왜 컴파일되는지 이해하지 못한다. – CodesInChaos