Почему массивы в .net реализуют только IEnumerable, а не IEnumerable <T>? - PullRequest
40 голосов
/ 05 мая 2010

Я реализовывал свой собственный класс ArrayList и был удивлен, когда понял, что

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

не работает. По какой причине массивы не поддерживают IEnumerator в .NET?

Есть ли обходной путь?

Спасибо

Ответы [ 2 ]

59 голосов
/ 05 мая 2010

Массивы реализуют IEnumerable<T>, но это делается как часть специальных знаний, которые CLI имеет для массивов. Это работает, как если бы это была явная реализация (но не так: это делается во время выполнения). Многие инструменты не показывают эту реализацию, это описано в разделе Замечания обзора класса Array.

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

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

Обратите внимание, что в старых версиях MSDN (pre docs.microsoft.com) это несколько раз менялось в разных версиях .NET, проверьте примечания раздел.

0 голосов
/ 07 мая 2016

Вы можете использовать универсальный метод IEnumerable<T> OfType<T>() из пространства имен System.Linq, расширяющий интерфейс IEnumerable. Он отфильтрует все элементы, тип которых отличается от T, и вернет IEnumerable<T> collection. Если вы используете оператор преобразования (IEnumerable<T>)_array, это может быть небезопасно, поскольку System.Array (и другие неуниверсальные типы) хранит элементы типа System.Object.

...