Immaginate il seguente codice:Foreach può lanciare InvalidCastException?
class foreach_convert
{
public static void method2()
{
List<IComparable> x = new List<IComparable>();
x.Add(5);
foreach (string s in x)
{
//InvalidCastException in runtime
}
}
}
mi chiedo, perché è questo comportamento foreach così ... non C# -come? Quello che succede qui è un cast implicito in una sottoclasse, che è soggetta a errori e sembra essere vietata in ogni altro posto nella lingua. O non ho ragione?
P.S. La ragione per cui sto chiedendo è che ho avuto un bug nel codice simile nel mio progetto, dove ho usato per scorrere una raccolta personalizzata da una libreria esterna, che è stata chiamata come SomeTypeCollection
, ma in realtà ha fornito una raccolta di elementi di tipo base e avrebbe potuto contenere articoli di SomeOtherType
. Colpa mia, ma ancora né la lingua, né il compilatore hanno fornito suggerimenti/avvertenze esplicite, cosa abbastanza inusuale per C# ...
Heh, per prima cosa mi sono imbattuto in questo quando speravo (non mi aspettavo davvero) che foreach avrebbe implicitamente filtrato gli oggetti nella raccolta in base al loro tipo. Pensa a come legge "Per ogni stringa nella collezione". Per me, si legge: "Per ogni cosa nella collezione è una stringa, fai qualcosa". Quindi ignorerebbe tutto ciò che non era una stringa. –