Использование foreach с ArrayList - автоматическое приведение? - PullRequest
10 голосов
/ 22 января 2011
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

foreach(string s in x)
{
}

Значит ли это, что при запуске foreach он пытается привести элемент списка массивов к типу выражения foreach?

Ответы [ 3 ]

11 голосов
/ 22 января 2011

Да, если элемент не может быть преобразован в тип, вы получите InvalidCastException.В вашем случае вы не можете привести в штучной упаковке int к string, вызывая исключение.

По сути, это эквивалентно:

foreach (object __o in list) {
    string s = (string)__o;
    // loop body
}
9 голосов
/ 22 января 2011

Согласно c # спецификации оператора foreach, ваш код эквивалентен

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();
}
1 голос
/ 22 января 2011

Да, конечно, когда вы запускаете этот цикл и приводите его с помощью, компилятор попытается привести его к указанному типу, который в вашем случае будет String. и если он не может сделать это, он вызовет InvalidCastException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...