2009-10-10 9 views
10

今私は、比較的単純なクラスの設定があります:私はC#foreachの派生クラスの動作ですか?

foreach(B i in ListOfObjects) 

を行う場合に何が起こるか

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

私はタイプBのオブジェクトのみを取得するのでしょうか?それはいくつかのオブジェクト指向の魔法を適用し、すべてのAsをBsに変換しますか?これは機能するでしょうか?

答えて

22

リストにAが含まれている場合(またはBまたはサブクラスがB以外の場合)、無効なキャストで破損することがあります。おそらく:

foreach(B i in ListOfObjects.OfType<B>()) {...} 

in .NET 3.5。 (私はリスト自体がnullではないと仮定しています、btw)

3

foreachリストすべてオブジェクトがコレクションに含まれています。項目の実行時の型が反復子変数の型(B型のケースi)と互換性がない場合、TypeCasExceptionがスローされます。

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

をそれとも、それを反復する前にリストをフィルタリングすることができます

代わりに、あなたはこれを行うことができます。最も簡単な解決策は、linqクエリです。

7

私は個人的にはforeachのループ変数としてvarを使用し、無効な実行時のキャストの可能性を避けるためです。そうすれば、ループ変数の型はコレクションのアイテムの静的型になります。他のものが必要な場合は、OfTypeを使用して安全なフィルタリングキャストを実行します。

Some more explanation here.

関連する問題