페<T> 제공하는 두 가지 GetEnumerator 방법-차이는 무엇인가요?
-
05-09-2019 - |
문제
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
지의 큰 관심(또는 불명).
하나는 일반적이며 다른 하나는 그렇지 않습니다. 컴파일러가 일반 오버로드를 사용하는 것을 선호한다고 생각합니다.