Почему операторы foreach принимают объекты, которые реализуют шаблон 'Collection', вместо того, чтобы принимать только объекты, которые реализуют IEnumerable? - PullRequest
2 голосов
/ 25 декабря 2008

Многие люди спрашивают меня, почему, и у меня нет хорошего ответа для них.

Очевидно, что есть веская причина. Кто-нибудь знает это?

Я искал здесь и нашел этот вопрос . Это объясняет, как это работает, но не почему.

Ответы [ 2 ]

11 голосов
/ 25 декабря 2008

Предположим, вы хотели эквивалент IEnumerable<int>, но использовали C # 1.0. Вы могли бы реализовать IEnumerable - но это потребовало бы упаковки и распаковки на каждой итерации. Используя версию foreach с типизацией утки, вы можете обойтись без бокса. Во многих случаях бокс на самом деле не был бы таким вредным (я склонен считать, что удар по производительности преувеличен ), но он все еще не элегантен.

Я сильно, сильно подозреваю, что если бы дженерики были в C # 1.0, foreach был бы ограничен IEnumerable<T>.

1 голос
/ 15 ноября 2011

У foreach, набранного уткой, есть несколько преимуществ по сравнению с IEnumerable:

  1. Есть некоторые вещи, которые удовлетворяют достаточному количеству контракта "IEnumerable", чтобы их можно было использовать с "foreach", но которые не полностью удовлетворяют контракту, особенно возможность многократного получения независимых перечислителей. В связи с этим, альтернативным решением было бы предоставление возможности «foreach» принимать либо IEnumerator [универсальный или нет], либо IEnumerable [аналогично].
  2. Хотя некоторые реализации IEnumerable.GetEnumerator возвращают структуру, которая реализует IEnumerator, и хотя это полезно при использовании утиной типизации, поведение может быть проблематичным в некоторых контекстах. Тот факт, что foreach использует типизацию утилит, позволяет компиляторам иметь общедоступную функцию GetEnumerator (), возвращающую перечислитель типа структуры (которая не реализует никакого интерфейса), и компиляторы используют это, в то время как IEnumerable.GetEnumerator возвращает класс.

Второе преимущество действительно может быть достигнуто только с помощью утки.

...