现在我有一个相对简单的课程设置:
class A{
//stuff
}
class B:A{
//more stuff
}
public List<A> ListOfObjects;
如果我这样做会发生什么
foreach(B i in ListOfObjects)
我只能得到B型物品吗?它会应用一些OO魔法并将所有As转换为Bs吗?这甚至会起作用吗?
答案 0 :(得分:24)
如果列表中包含A
(或其他不是B
的内容或B
的子类),那么它只会破坏无效转换。你可能想要:
foreach(B i in ListOfObjects.OfType<B>()) {...}
在.NET 3.5中。 (我假设列表本身是非空的,顺便说一句)
答案 1 :(得分:7)
我个人在var
中使用foreach
作为循环变量,以避免任何可能的运行时无效转换。这样,循环变量的类型将是集合项的静态类型;如果您需要其他内容,请使用OfType
执行安全过滤转换。
答案 2 :(得分:3)
foreach列出集合中的所有对象。如果项的运行时类型与迭代器变量的类型不兼容(在您的情况下是类型B的类型),则抛出TypeCasException。
相反,你可以这样做:
foreach(A i in ListOfObjects)
{
B b = i as B
if (b!=null) ..
}
或者您可以在迭代之前过滤列表。最简单的解决方案是linq查询。