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
должен быть выполнен во время выполнения и может дать сбой.