Что стоит за приведением foreach к типу переменной?

#c#

#c#

Вопрос:

Похоже, у нас могло бы быть просто обычное статически проверяемое присваивание. Я не уверен, что вижу преимущество в этом случае. Чего мне не хватает?

Комментарии:

1. @Adi: Foreach работает с нестандартным IEnumerable и добавит неявное преобразование. Я полагаю, что это то, на что здесь ссылается Dejas…

2. Meh… Использование var — проблема исчезает (вы ничего не можете сделать, кроме правильного назначения / без операции)

Ответ №1:

Проблема здесь в том, что foreach она была разработана до появления generics, которых не существовало до .NET 2.0. В .NET 1.1, если вы использовали класс collection, IEnumerator свойство Current интерфейса всегда возвращает System.Object .

Заставляя foreach выполнять приведение, вы могли бы написать:

 foreach(string item in collection)
  

Вместо того, чтобы явно писать:

 foreach(object temp in collection)
{
     string item = (string)temp;
  

Конечно, с .NET 2 это на самом деле больше не проблема.

Ответ №2:

История foreach предшествует generic IEnumerable , и поэтому это облегчило перечисление по таким коллекциям, как ArrayList . Теперь это.NET имеет общие коллекции и ArrayList редко используется, свободное приведение действительно кажется немного несоответствующим импедансу с тем, как это было бы разработано, если бы функция была добавлена сейчас.

Тем не менее, теперь, когда у нас есть эта функция, вы все еще видите, что люди используют ее даже с универсальными коллекциями для приведения к типу, который, как они знают, им нужен, тем самым избегая нескольких строк кода. Это не слишком далеко ушло от того, как это использовалось в ArrayList дни.