2010-05-05 2 views
35

я реализую свой собственный класс ArrayList и остался удивлен, когда я понял, чтоПочему массивы в .net только реализуют IEnumerable, а не IEnumerable <T>?

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

не работает. Какова причина, по которой массивы не реализуют IEnumerator в .NET?

Есть ли какая-нибудь работа?

Благодаря

+4

Зачем вам реализовать свой собственный класс ArrayList, если уже существует более дюжины существующих классов коллекций? – Aaronaught

+52

Почему бы мне? Я устал от таких комментариев. –

+4

Мы не задаем такие вопросы, чтобы вас раздражать, но чтобы выяснить, что именно вы пытаетесь сделать. Это помогает нам лучше ответить. – Steven

ответ

49

Массивы делают реализацию IEnumerable<T>, но это делается в рамках специальных знаний консоли имеет для массивов. Многие инструменты не будут показывать эту реализацию. См. Параграф в примечаниях, начиная с примечания «Начиная с .NET Framework 2.0» в documentation (документация для более ранних версий .NET: найдите блок «Важный»).

Вы можете добавить бросок:

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

Он работает так же, как если бы «class» 'T []' реализовал 'IEnumerable ' посредством _explicit interface implementation_. Если вы просто скажете '_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<T> OfType<T>() из System.Linq пространства имен, который расширяет IEnumerable интерфейс. Он будет фильтровать все элементы, тип которых отличается от T и возвращает IEnumerable<T> collection. Если вы используете операционный оператор (IEnumerable<T>)_array, это может быть небезопасно, потому что System.Array (и другие неродственные типы) хранит предметы типа System.Object.

+0

Только массивы объектов (т. Е. 'Object [] arr') сохраняет объект как объект. Помимо этого, массивы являются безопасными по типу. Это делает излишние методы OfType и Cast. – jmoreno