Вспомните, что было до дженериков ... foreach
нужно было приводить, чтобы вы могли делать разумные вещи, например:
foreach (string x in names)
{
// ...
}
вместо:
foreach (object tmp in names)
{
string x = (string) tmp;
// ...
}
Последнее просто неприглядно, ИМО. Предоставление неявного преобразования типов отличается от остального языка, но делает его намного проще в использовании в подавляющем большинстве случаев.
Я подозреваю , что если бы в C # были дженерики и методы расширения для начала (чтобы мы могли использовать OfType
и Cast
), которые foreach
не будут указываться таким же образом.
Обратите внимание, что в foreach
еще больше странностей: тип вообще не должен реализовывать IEnumerable
. Пока у него есть метод GetEnumerator
, который возвращает что-то, что в свою очередь имеет MoveNext ()
и Current
, компилятор C # счастлив. Это означало, что вы могли реализовать «строго типизированный итератор» (чтобы избежать боксов) перед универсальными шаблонами.
В C # 3 я использую var - поэтому я получаю предупреждения компилятора.
foreach работает с IEnumerable, который возвращает объекты типа object . Для каждого элемента объект будет приведен к указанному вами типу.
Если вы не используете var в C # 3.0. Тогда тип будет взят из IEnumerable
, если он реализован коллекцией.