2009-10-10 15 views
10

Im Moment habe ich eine relativ einfache Klasse Setup:C# foreach Verhalten mit abgeleiteten Klassen?

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

Was passiert, wenn ich

tun passieren würde
foreach(B i in ListOfObjects) 

würde ich nur Objekte vom Typ B erhalten? Würde es einige OO-Magie anwenden und alle As in Bs konvertieren? Würde das überhaupt funktionieren?

Antwort

22

Wenn die Liste A 's drin hat (oder andere Dinge, die nicht B oder Unterklassen von B sind), dann würde es einfach mit einem ungültigen Cast brechen. Sie möchten wahrscheinlich:

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

in .NET 3.5. (Ich nehme an, dass die Liste selbst nicht null ist, btw)

3

Foreach-Listen alle Objekte in der Sammlung. Wenn der Laufzeittyp eines Elements nicht mit dem Typ der Iteratorvariablen (in Ihrem Fall i vom Typ B) kompatibel ist, wird eine TypeCasException ausgelöst.

Stattdessen können Sie dies tun:

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

Oder Sie können die Liste filtern, bevor es iterieren. Die einfachste Lösung ist eine linq-Abfrage.

7

Ich persönlich var als die Loop-Variable in foreach unter allen Umständen verwenden, um jede Möglichkeit einer ungültigen Laufzeitumwandlung zu vermeiden. Auf diese Weise wird der Typ der Schleifenvariablen der statische Typ der Elemente der Sammlung sein; Wenn Sie etwas anderes möchten, verwenden Sie OfType, um einen sicheren Filter-Cast durchzuführen.

Some more explanation here.

Verwandte Themen