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

rtp*_*tpg 12 c#

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

class A{
//stuff
}
class B:A{
//more stuff
}
public List<A> ListOfObjects;
Run Code Online (Sandbox Code Playgroud)

如果我这样做会发生什么

foreach(B i in ListOfObjects)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 24

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

foreach(B i in ListOfObjects.OfType<B>()) {...}
Run Code Online (Sandbox Code Playgroud)

在.NET 3.5中.(我假设列表本身是非空的,顺便说一句)


Dan*_*ker 7

我个人在所有情况下都使用var循环变量foreach,以避免任何运行时无效转换的可能性.这样,循环变量的类型将是集合项的静态类型; 如果你想要别的东西,可以OfType用来执行安全的过滤转换.

这里有更多解释.