0

次のコードがあるとします。

static void Main() {
    string[] myArray = {"One", "Two", "Three"};

    PrintArray(myArray);
}

static void PrintArray(System.Array array1) {

    foreach (string s in array1) 
        Console.WriteLine(s);
}

これらの行をエラーなしでコンパイルできたことに驚いています。なぜならPrintArray、コンパイラは array1 がどのような種類の配列なのか (この場合は ) を認識できないからSystem.string[]です。foreach 行を次のように変更するforeach (int s in array1)と、コードはコンパイルされますが、実行時に無効なキャスト例外が生成されます。

この場合のコンパイルは、オブジェクトのみが foreach ステートメントで使用できることを保証するべきではありませんか?

4

2 に答える 2

2

ループ変数の型を指定することで、配列内の各要素をその型として明示的にアンボックス化/キャストします。

文字列の場合は、オブジェクトから文字列へのキャストです。
配列が int 配列の場合、キャストの代わりにボックス化解除操作を行うことになります。

于 2012-09-19T07:35:44.633 に答える
0

System.Arrayコンパイラは、objectベースのコレクションであるを渡していることを認識しています。配列に含まれるオブジェクトの種類を静的に知ることはできないため、一般的なケースでコードがエラーなしで実行されることを保証する方法はありません。へのキャストintは実行時に実行する必要があり、失敗する可能性があります。

于 2012-09-19T07:36:36.073 に答える