Eventuali duplicati:
Foreach can throw an InvalidCastException?Perché il compilatore ha lasciato questo slittamento?
Si consideri il seguente blocco di codice
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());
}
}
}
Avviso il cast dalla base alla DerivedLeft nella dichiarazione foreach. Compilano bene (Visual Studio 2010), senza errori o avvisi. Ovviamente, nella seconda iterazione del ciclo otterremo una InvalidCastException. Se mi venisse posta una domanda sulla reazione del compilatore a tale codice, direi senza dubbio che il compilatore non lascerà passare inosservato questo e produrrà almeno un avvertimento. Ma a quanto pare non è così. Quindi, perché il compilatore ha permesso a questo scivolone?
Credo che il compilatore non controlla l'inizializzazione .... es. se inserisco MyOtherClass, esiste un'eccezione di compilazione –
@RoyiNamir: Sì, il compilatore verifica se l'inizializzazione è corretta, ma non controlla se sono presenti solo gli elementi corrispondenti quando raggiunge il ciclo foreach. – Fischermaen
corretto ............ –