使用派生类的C#foreach行为?

时间:2009-10-10 22:40:38

标签: c#

现在我有一个相对简单的课程设置:

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

如果我这样做会发生什么

foreach(B i in ListOfObjects)

我只能得到B型物品吗?它会应用一些OO魔法并将所有As转换为Bs吗?这甚至会起作用吗?

3 个答案:

答案 0 :(得分:24)

如果列表中包含A(或其他不是B的内容或B的子类),那么它只会破坏无效转换。你可能想要:

foreach(B i in ListOfObjects.OfType<B>()) {...}
在.NET 3.5中

。 (我假设列表本身是非空的,顺便说一句)

答案 1 :(得分:7)

我个人在var中使用foreach作为循环变量,以避免任何可能的运行时无效转换。这样,循环变量的类型将是集合项的静态类型;如果您需要其他内容,请使用OfType执行安全过滤转换。

Some more explanation here.

答案 2 :(得分:3)

foreach列出集合中的所有对象。如果项的运行时类型与迭代器变量的类型不兼容(在您的情况下是类型B的类型),则抛出TypeCasException。

相反,你可以这样做:

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

或者您可以在迭代之前过滤列表。最简单的解决方案是linq查询。