2009-10-10 2 views
10

Сейчас у меня есть относительно простой установки класса:C# foreach поведение с производными классами?

class A{ 
//stuff 
} 
class B:A{ 
//more stuff 
} 
public List<A> ListOfObjects; 

Что произойдет, если я

foreach(B i in ListOfObjects) 

бы я только объекты типа B? Применит ли он магию OO и преобразует все как в B? Будет ли это работать?

ответ

22

Если список был A «S в нем (или другие вещи, которые не B или подклассов B), то было бы просто разорвать с некорректным литьем. Вероятно, вы хотите:

foreach(B i in ListOfObjects.OfType<B>()) {...} 

in .NET 3.5. (Я предполагаю, что сам список будет не нулевым, btw)

3

листы foreach все объекты в коллекции. Если тип среды выполнения несовместим с типом переменной итератора (в вашем случае i типа B), генерируется исключение TypeCasException.

Вместо этого вы можете сделать это:

foreach(A i in ListOfObjects) 
{ 
    B b = i as B 
    if (b!=null) .. 
} 

Или вы можете отфильтровать список, прежде чем итерация его. Простейшим решением будет запрос linq.

7

Я лично использую var как переменную цикла в foreach при любых обстоятельствах, чтобы избежать любой возможности недействительного выполнения. Таким образом, тип переменной цикла будет статическим типом элементов коллекции; если вы хотите что-то еще, используйте OfType для выполнения безопасной фильтрации.

Some more explanation here.

Смежные вопросы