2009-10-10 11 views
10

Ahora mismo tienen una configuración de clase relativamente simple:C# comportamiento foreach con clases derivadas?

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

¿Qué pasaría si hago

foreach(B i in ListOfObjects) 

puedo obtener sólo los objetos de tipo B? ¿Aplicará algo de OO magic y convertirá todos los As a Bs? ¿Esto funcionaría?

Respuesta

22

Si la lista tenía A 's en él (u otras cosas que no son B o subclases de B), entonces simplemente se rompería con un molde no válido. Probablemente desee:

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

en .NET 3.5. (Supongo que la lista en sí no será nula, por cierto)

3

foreach lists todos objetos en la colección. Si el tipo de tiempo de ejecución de un elemento no es compatible con el tipo de la variable de iterador (en su caso i de tipo B) se lanza una TypeCasException.

su lugar se puede hacer esto:

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

O puede filtrar la lista antes de la iteración de la misma. La solución más simple será una consulta de linq.

7

Yo personalmente uso var como la variable de lazo en foreach bajo todas las circunstancias, para evitar cualquier posibilidad de un lanzamiento en tiempo de ejecución no válido. De esta forma, el tipo de variable de ciclo será el tipo estático de los elementos de la colección; si quiere algo más, use OfType para realizar un molde de filtrado seguro.

Some more explanation here.

Cuestiones relacionadas