Imaginer le code suivant:Foreach peut lancer une exception 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
}
}
}
Je me demande, pourquoi est-ce comportement foreach donc ... pas C# -comme? Ce qui se passe ici est une distribution implicite à une sous-classe, qui est sujette aux erreurs et semble être bannie dans tous les autres endroits de la langue. Ou n'ai-je pas raison?
P.S. La raison pour laquelle je demande est que j'ai eu un bug dans le code similaire dans mon projet, où je l'habitude de parcourir une collection personnalisée à partir d'une bibliothèque externe, appelée SomeTypeCollection
, mais en fait fourni une collection d'éléments de type base et aurait pu contenir des éléments de SomeOtherType
. Ma faute, mais ni la langue, ni le compilateur fourni des indices/avertissements explicites, ce qui est inhabituel pour C# ...
Heh, j'ai d'abord rencontré ça quand j'espérais (pas vraiment) que foreach filtrerait implicitement les objets de la collection en fonction de leur type. Pensez à la façon dont il se lit, "Pour chaque chaîne de la collection." Pour moi, cela se lit comme, "Pour tout ce qui dans la collection est une chaîne, faites quelque chose." Il ignorerait alors tout ce qui n'était pas une chaîne. –