Компилятор C # выполняет приведение неявно для вас. С точки зрения каста (но только в этих терминах 1 ) это эквивалентно:
foreach (object tmp in collection)
{
Foo f = (Foo) tmp;
...
}
Обратите внимание, что это произойдет и с общими коллекциями:
List<object> list = new List<object> { "hello", "there", 12345 };
// This will go bang on the last element
foreach (string x in list)
{
}
Все это подробно описано в разделе 8.8.4 спецификации C # 4.
Если вы используете .NET 3.5 или выше и хотите выбрать только элементы соответствующего типа, вы можете использовать Enumerable.OfType
:
LegacyFooCollection collection = GetFooCollection();
foreach (Foo f in collection.OfType<Foo>())
{
// etc.
}
Это может быть необязательно для LegacyFooCollection
, но может быть полезно, когда вы пытаетесь найти (скажем) все TextBox
элементы управления в форме.
1 Различия:
- В исходном коде
f
только для чтения; в «конверсии» это доступно для записи
- В исходном коде, если вы захватите
f
, вы (в настоящее время) захватите одну переменную на всех итерациях, в отличие от отдельной переменной на каждую итерацию в «преобразовании»