CodesInChaos ответ неверный.Массив типа значения повторяется без упаковки из-за специальной обработки в компиляторе C #, а не специальной обработки во время выполнения.Компилятор C # преобразует цикл foreach в цикл for, когда статический тип повторяющейся коллекции является типом массива.
Кроме того, ваш вопрос основан на неверном предположении («Массив расширяет только неуниверсальную версию»).IEnumerable ").Фактически, массивы реализуют универсальный IEnumerable<T>
;просто это делается с использованием явной реализации члена по причинам обратной совместимости.(Кроме того, тот факт, что массивы реализуют универсальные интерфейсы , является случаем специальной обработки во время выполнения; вы не увидите их в определении System.Array
при декомпиляции mscorlib.)
Это означает, что если у вас есть массив int[] a
и вы вызываете a.GetEnumerator()
, вы получите не универсальную ссылку IEnumerator
.Тем не менее, вы можете явным образом привести, чтобы получить общую ссылку IEnumerator<int>
: ((IEnumerable<int>)a).GetEnumerator()
.