10
votes

Utilisation de foreseach avec arraylist - Casting automatique?

ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

foreach(string s in x)
{
}
Does it mean that when foreach is run it tries to cast element of array list to type in foreach expression?

2 commentaires

Je sais ce que ça fait, tout simplement pas sûr s'il y a eu une coulée interne de l'objet à un type spécifié.


Malheureusement, foreach fait implicitement les éléments du type spécifié pour la variable de boucle même si la distribution est normalement explicite. Une des choses laides que nous avons héritées des temps des pré-génériques.


3 Réponses :


13
votes

Oui, si un élément n'est pas convertible au type, vous obtiendrez un invalidalcastexception . Dans votre cas, vous ne pouvez pas lancer Boxed int à chaîne provoquant une exception à lancer.

essentiellement, c'est équivalent à: xxx


0 commentaires

1
votes

Oui, bien sûr, lorsque vous exécutez cette boucle et que vous le jetez, le compilateur essaiera de la jeter au type spécifié, qui dans votre cas, il s'agira de chaîne. Et si cela ne peut pas le faire, cela augmentera une erreur invalide.


0 commentaires

11
votes

Selon c # Spécification de Déclaration foreach, votre code est équivalent à

ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

IEnumerator enumerator = (x).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      string element = (string)enumerator.Current; // here is casting occures
      // loop body;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}


0 commentaires