-2

如果您有一个实现各种接口的对象集合,并且您foreach对该集合执行特定接口(只有集合的某些成员实现)会发生什么?是否可以跳过不实现该接口的成员?

interface IFoo {}
interface IBar {}

class Foo : IFoo {}
class Baz : IFoo, IBar {}

...

var foos = new List<IFoo> ();

foos.Add(new Foo());
foos.Add(new Baz());

foreach (IBar bar in foos)
{
    // What happens now?
}
4

1 回答 1

9
foreach (IBar bar in foo)
{
    // What happens now?
}

// 现在会发生什么?

现在什么都没有发生,因为您已经InvalidCastException在第一排获得了...

为什么?

foreach语句被翻译成类似的东西:

foreach (object f in foo)
{
    IBar bar = (IBar) f;

    ...
}

其中有一个隐式转换,foreach statement
允许您编写如下愚蠢的东西而不会出现编译时错误:

var foo  = new List<string>{ "111", "222","333"};
foreach (IBar bar in foo) // InvalidCastException at runtime.
{
    ...
}

您可以按照@Erno 的建议使用 LINQ 来仅获取实现IBar接口的对象:

foreach(IBar bar in foo.OfType<IBar>())

这就像:

foo.Where(f => f is IBar)
于 2012-09-20T07:12:46.340 回答