2011-01-22 13 views
10
ArrayList x=new ArrayList(); 
x.Add(10); 
x.Add("SS"); 

foreach(string s in x) 
{ 
} 

Bu, foreach çalıştırıldığında, foreach ifadesine yazmak için dizi listesi öğesi oluşturmaya çalıştığı anlamına mı geliyor?ArrayList ile foreach kullanımı - otomatik döküm?

+3

Run eşdeğer ve vurgulamak. – BoltClock

+0

Ne işe yaradığını biliyorum, sadece belirli türden nesnelere dahili döküm olup olmadığından emin değilim. – Lojol

+1

Maalesef 'foreach', cast normalde açık olsa bile, x'in öğelerini döngü değişkenine belirtilen türden dolaylı olarak döker. Ön jenerik zamanlarından miras aldığımız çirkin şeylerden biri. – CodesInChaos

cevap

10

Evet, bir öğe türüne dönüştürülemiyorsa, bir InvalidCastException alırsınız. Durumunuzda, int numaralı kutuyu string'a atayamazsınız, bu da bir istisnanın atılmasına neden olur. O döngü çalıştırmak ve derleyici sizin durumunuzda o dize olacak belirtilen tür, bunu döküm çalışacağız, onu dökme zaman tabii

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

Evet:

Esasen, eşdeğer var . ve bunu yapamazsa bir InvalidCastException yükseltir.

8

foreach ifadesi C# specification göre, kod kod

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(); 
}