문제

When I emplement IEnumerable<T> 인터페이스의 GetEnumerator 방법:하나로 돌아 IEnumerator 기타 IEnumerator<T>.을 때 하나를 사용하는 것이나 다른?

도움이 되었습니까?

해결책

당신이 구현하는 경우 IEnumerable<T> 일반적인 인터페이스, 당신은 객체를 (가상이 아닌) ienumerable에 명시 적으로 캐스팅하지 않는 한 항상 일반적인 getEnumerator 메소드를 사용해야합니다.

그 이유는 제네릭을 지원하지 않는 .NET 1.0/1.1과 거꾸로 호환되기 때문입니다.

다른 팁

당신은 일반적으로 둘 다 구현합니다. 하나는 TypeSAFE 열거자를 반환하는 최신 일반 버전입니다.IEnumerator<T>). 다른 하나는 레거시 코드와의 호환성입니다 (반환 IEnumerator). 일반적인 구현은 다음과 같습니다.

public IEnumerator<T> GetEnumerator() {
    foreach(T item in items) {
        yield return item;
    }
}

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}

두 가지 방법이있는 이유는 때문입니다 IEnumerable<T> 상속 IEnumerable 인터페이스로 일반 방법이 보입니다 IEnumerable<T> 그리고 비 게 니커 방법 IEnumerable.

다음은 유형에서 인터페이스를 구현하는 방법입니다.

class Foo : IEnumerable<Foo>
{
    public IEnumerator<Foo> GetEnumerator()   
    {
        // do your thing here
    }

    // do a EIMI here and simply call the generic method
    IEnumerator IEnumerable.GetEnumerator()
    {
        this.GetEnumerator();
    }
}

일반적으로 GetEnumerator() 전화 GetEnumerator<T>(), 다,그래서 없어야에서의 차이는 동작입니다.으로는 이유에 대한 두 가지 방법이 있습니다,이것은 역호환성을 위해고에 사용하기 위해 상황 T 지의 큰 관심(또는 불명).

하나는 일반적이며 다른 하나는 그렇지 않습니다. 컴파일러가 일반 오버로드를 사용하는 것을 선호한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top