2009-10-10 13 views
10

Teraz mam stosunkowo prostą klasę Setup:C# foreach zachowanie z klas pochodnych?

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

co by się stało, gdybym zrobić

foreach(B i in ListOfObjects) 

chciałbym dostać tylko obiekty typu B? Czy zastosuje trochę magii OO i zamieni wszystko na Bs? Czy to nawet zadziała?

Odpowiedz

22

Jeśli lista zawierała A (lub inne rzeczy, które nie są B lub podklasy B), to po prostu zerwie z nieprawidłowym rzutowaniem. Prawdopodobnie chcesz:

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

w .NET 3.5. (Zakładam, że sama lista będzie miała wartość inną niż null, btw).

3

Listy foreach wszystkie obiektów w kolekcji. Jeśli typ środowiska wykonawczego elementu nie jest zgodny z typem zmiennej iteracyjnej (w twoim przypadku i typu B) generowany jest wyjątek TypeCasException.

Zamiast tego można to zrobić:

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

Albo można filtrować listę przed iteracja go. Najprostszym rozwiązaniem będzie zapytanie linq.

7

Ja osobiście używam var jako zmiennej pętli w foreach w każdych okolicznościach, aby uniknąć możliwości rzucenia nieprawidłowego środowiska wykonawczego. W ten sposób typ zmiennej pętli będzie statycznym typem elementów kolekcji; jeśli chcesz czegoś innego, użyj OfType, aby wykonać bezpieczną rzutowanie filtrujące.

Some more explanation here.

Powiązane problemy