Foreach может бросить InvalidCastException?

Добавить

display: block;

к <img>.

19
задан Chris Frederick 31 October 2011 в 05:36
поделиться

3 ответа

Вспомните, что было до дженериков ... 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 # счастлив. Это означало, что вы могли реализовать «строго типизированный итератор» (чтобы избежать боксов) перед универсальными шаблонами.

23
ответ дан 30 November 2019 в 03:38
поделиться

В C # 3 я использую var - поэтому я получаю предупреждения компилятора.

9
ответ дан 30 November 2019 в 03:38
поделиться

foreach работает с IEnumerable, который возвращает объекты типа object . Для каждого элемента объект будет приведен к указанному вами типу.

Если вы не используете var в C # 3.0. Тогда тип будет взят из IEnumerable , если он реализован коллекцией.

4
ответ дан 30 November 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: