Ответ для IEnumerable
: «потому что может, не затрагивая безопасность типов».
IEnumerable
- это интерфейс «только для чтения», поэтому не имеет значения, что универсальная форма более специфична, чем неуниверсальная форма. Вы ничего не нарушаете, реализуя оба. IEnumerator.Current
возвращает object
, тогда как IEnumerator<T>.Current
возвращает T
- это нормально, так как вы всегда можете законно преобразовать в object
, хотя это может означать бокс.
Сравните это с IList<T>
и IList
- вы можете позвонить Add(object)
на IList
, тогда как это может быть недействительным для любого конкретного IList<T>
(на самом деле, всего, кроме IList<object>
).
1020 * Брэда Абрама в блоге с ответом Андерса на этот самый вопрос.