#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
дни.