ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");
foreach(string s in x)
{
}
foreachを実行すると、配列リストの要素をforeach式に入力しようとしますか?ArrayListでforeachを使用する - 自動キャスト?
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");
foreach(string s in x)
{
}
foreachを実行すると、配列リストの要素をforeach式に入力しようとしますか?ArrayListでforeachを使用する - 自動キャスト?
はい、要素がタイプに変換できない場合、InvalidCastException
が返されます。あなたのケースでは、ボックス化されたint
をstring
にキャストできないため、例外がスローされます。
基本的に、それはと同等です:あなたはそのループを実行し、それをキャストする場合、コンパイラはあなたのケースでは、それは文字列になりますこれは、指定した型にキャストしようと当然の
foreach (object __o in list) {
string s = (string)__o;
// loop body
}
はい。それができない場合は、InvalidCastExceptionが発生します。
は、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();
}
と同等です。 – BoltClock
私はそれが何をしているのか、オブジェクトから指定された型への内部キャスティングがあるかどうかは分かりません。 – Lojol
残念ながら、 'foreach'は、キャストが通常明示的であっても、xの要素をループ変数に指定された型に暗黙的にキャストします。私たちがジェネリック時代から継承した醜いものの一つ。 – CodesInChaos