Duplicar posible:
Foreach can throw an InvalidCastException?¿Por qué el compilador deja esto resbalar?
Considere el siguiente bloque de código
public class Base
{
}
public class DerivedLeft : Base
{
}
public class DerivedRight : Base
{
}
class Program
{
static void Main(string[] args)
{
List<Base> list = new List<Base> { new DerivedLeft(), new DerivedRight() };
foreach (DerivedLeft dl in list)
{
Console.WriteLine(dl.ToString());
}
}
}
Aviso al elenco de la base a DerivedLeft de instrucción foreach. Esto compila bien (Visual Studio 2010), sin ningún error o incluso advertencia. Obviamente, en la segunda iteración de bucle obtendremos una InvalidCastException. Si me hicieran una pregunta sobre la reacción del compilador a dicho código, diría, sin duda, que el compilador no dejará que esto pase desapercibido y producirá al menos una advertencia. Pero aparentemente no es así. Entonces, ¿por qué el compilador deja pasar esto?
Creo que el compilador no comprueba la inicialización .... por ejemplo. si pongo MyOtherClass allí para que haya una excepción de tiempo de compilación –
@RoyiNamir: Sí, el compilador comprueba si la inicialización es correcta, pero no comprueba si solo hay elementos coincidentes cuando alcanza el ciclo foreach. – Fischermaen
correcto ............ –