-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 に答える