Почему массивы в .net только реализуют IEnumerable, а не IEnumerable <T>?
Я реализовал свой собственный класс ArrayList и был удивлен, когда понял, что
public System.Collections.Generic.IEnumerator<T> GetEnumerator() {
return _array.GetEnumerator();
}
не работает. Какова причина, по которой массивы не реализуют IEnumerator в .NET?
Есть ли какая-нибудь работа?
Спасибо
Ответы
Ответ 1
Массивы реализуют IEnumerable<T>
, но это делается как часть специальных знаний, которые CLI имеет для массивов. Многие инструменты не будут показывать эту реализацию. См. Параграф в примечаниях, начиная с примечания "Начиная с .NET Framework 2.0" в документации (документация для более ранних версий .NET: найдите "Важный" блок).
Вы можете добавить бросок:
return ((IEnumerable<T>)_array).GetEnumerator();
Ответ 2
Вы можете использовать общий метод IEnumerable<T> OfType<T>()
из пространства имен System.Linq, который расширяет интерфейс IEnumerable. Он будет отфильтровывать все элементы, тип которых отличается от T и возвращает IEnumerable<T> collection
. Если вы используете оператор преобразования (IEnumerable<T>)_array
, это может быть небезопасно, потому что System.Array
(и другие неродственные типы) хранит элементы типа System.Object
.