foreach on System.Array

时间:2012-09-19 07:24:53

标签: c# arrays casting 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 个答案:

答案 0 :(得分:2)

通过指定循环变量的类型,您明确地将数组中的每个元素拆箱/转换为该类型。

对于字符串,它是从对象到字符串的强制转换 如果你的数组是一个int数组,你将进行拆箱操作而不是强制转换。

答案 1 :(得分:0)

编译器知道您传入System.Array,这是一个基于object的集合。它无法静态地知道数组包含哪种对象,因此在一般情况下无法保证代码在没有错误的情况下运行。转换为int必须在运行时执行,并且可能会失败。