Использование foreach с ArrayList - автоматическое литье?

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

foreach(string s in x)
{
}

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

Ответ 1

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

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

foreach (object __o in list) {
    string s = (string)__o;
    // loop body
}

Ответ 2

В соответствии с С# спецификацией инструкции 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();
}

Ответ 3

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