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

foreach(string s in x) 
{ 
} 

foreachを実行すると、配列リストの要素をforeach式に入力しようとしますか?ArrayListでforeachを使用する - 自動キャスト?

+3

と同等です。 – BoltClock

+0

私はそれが何をしているのか、オブジェクトから指定された型への内部キャスティングがあるかどうかは分かりません。 – Lojol

+1

残念ながら、 'foreach'は、キャストが通常明示的であっても、xの要素をループ変数に指定された型に暗黙的にキャストします。私たちがジェネリック時代から継承した醜いものの一つ。 – CodesInChaos

答えて

10

はい、要素がタイプに変換できない場合、InvalidCastExceptionが返されます。あなたのケースでは、ボックス化されたintstringにキャストできないため、例外がスローされます。

基本的に、それはと同等です:あなたはそのループを実行し、それをキャストする場合、コンパイラはあなたのケースでは、それは文字列になりますこれは、指定した型にキャストしようと当然の

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

はい。それができない場合は、InvalidCastExceptionが発生します。

8

は、foreach文のC#specificationによると、あなたのコードは、コードを実行し、表示さ

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(); 
} 
関連する問題