Использование 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.