2010-05-05 6 views
35

나는 내 자신의 ArrayList 클래스를 구현하고 있었고, 난이.net의 배열은 IEnumerable 만 구현하고 IEnumerable은 구현하지 않는 이유는 무엇입니까? <T>?

public System.Collections.Generic.IEnumerator<T> GetEnumerator() { 
    return _array.GetEnumerator(); 
} 

이 작동하지 않았다는 것을 깨달았을 때 놀라지 남아 있었다. 배열이 .NET에서 IEnumerator를 구현하지 않는 이유는 무엇입니까?

해결 방법이 있습니까?

감사

+4

이미 기존 컬렉션 클래스가 12 개 이상인 경우 자신의 ArrayList 클래스를 구현할 수 있습니까? – Aaronaught

+52

왜 내가하지 않았을까요? 나는 그런 종류의 의견에 질렸다. –

+4

우리는 당신을 괴롭히기 위해 이런 종류의 질문을하지는 않지만 당신이하려고하는 것이 무엇인지 알아 내야합니다. 이는 우리에게 더 나은 답변을 제공하는 데 도움이됩니다. – Steven

답변

49

배열은 IEnumerable<T>을 구현 할 수 있지만,이 CLI는 배열에 대해 가지고있는 특별한 지식의 한 부분으로 이루어집니다. 많은 도구가이 구현을 표시하지 않습니다. documentation (이전 .NET 버전의 설명서 : "중요"블록 참조)의 ".NET Framework 2.0으로 시작"참고 사항의 단락을 참조하십시오.

당신은 캐스트를 추가 할 수 있습니다

return ((IEnumerable<T>)_array).GetEnumerator(); 
+0

마치 "클래스"T []가 _explicit 인터페이스 구현 _에 의해 IEnumerable 을 구현 한 것처럼 작동합니다. '_array.GetEnumerator()'라고 간단히 말하면 잘못된 반환 유형을 가진'public' 메소드를 얻습니다. –

+0

@RayL 설명서의 .NET 2.0 버전을 업데이트하십시오 :-). – Richard

+0

그냥 머리를 위로. 참조 된 https://msdn.microsoft.com/en-us/library/system.array.aspx#Remarks에서 : IList , ICollection 및 IEnumerable 일반 인터페이스를 구현합니다. – Wouter

-1

당신을 IEnumerable 인터페이스를 확장을 System.Linq 네임 스페이스에서 일반적인 방법 IEnumerable<T> OfType<T>()를 사용할 수 있습니다. 타입이 T와 다른 모든 요소를 ​​걸러 내고 IEnumerable<T> collection을 반환합니다. (IEnumerable<T>)_array 변환 연산자를 사용하는 경우 System.Array (및 기타 비 농어 유형)은 System.Object 유형의 항목을 저장하므로 안전하지 않을 수 있습니다.

+0

개체 배열 (즉, [Object [] arr') 만 항목을 개체로 저장합니다. 그것들 이외에, 배열은 타입 안전합니다. 따라서 OfType 및 Cast 메서드가 중복됩니다. – jmoreno

관련 문제