IEnumerable<T>
сама заставляет любую реализацию также реализовывать неуниверсальный IEnumerable
. Это безопасно по тем же причинам, по которым IEnumerable<out T>
является ковариантным с .NET 4 ... вы всегда можете преобразовать T
в object
для неуниверсальной формы.
В основном это означает, что если у вас есть код, который использует параметр типа IEnumerable
, вы все равно можете вызывать его с чем-то вроде List<T>
.
Эрик Липперт недавно написал в блоге о том, почему в коллекциях реализовано много интерфейсов, а Брэд Абрамс написал в блоге в 2005 году о конкретном IEnumerable<T>
/ * 1017. * решение.