foreach на System.Array

Учитывая следующий код:

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 может использоваться только Object?

2 ответа

Указывая тип переменной цикла, вы явно распаковываете / выводите каждый элемент в вашем массиве как этот тип.

В случае строки это приведение от объекта к строке.
Если ваш массив будет массивом int, вы будете выполнять операцию распаковки вместо приведения.

Компилятор знает, что вы передаете System.Array, который является objectколлекция. Он не может статически знать, какие объекты содержит массив, поэтому нет способа гарантировать, что код будет работать без ошибок в общем случае. Актерский состав int должен быть выполнен во время выполнения и может дать сбой.

Другие вопросы по тегам