Absolutamente nada, pero lo hace de una manera muy ineficiente.
El orden de las operaciones es la siguiente:
- instanciar una nueva lista, con cero elementos
- iterar sobre esa lista recién instanciado, que tiene cero artículos
- No convertir el objeto base a un Derivado objeto, porque la lista tiene cero elementos. Si la lista tuviera algún elemento, este paso daría lugar a una excepción en tiempo de ejecución.
- No ejecuta el código en el bloque foreach, porque la lista tiene cero elementos.
Editar
Sobre la base de su edición, se corre el riesgo de una InvalidCastException
si cualquier elemento de la lista que se pasa a Foo
no ser en realidad un objeto Derived
.
Edit2
¿Por qué compila? Debido foreach
implica una conversión implícita a Object
para cada elemento de la lista, y luego otra conversión explícita al tipo especificado en el bloque foreach
, en este caso Derived
Lea sobre el polimorfismo, aquí hay un lugar para comenzar: http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming – Donnie
Sé lo que es el polimorfismo. –