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 语句中只能使用 Object 吗?

4

2 回答 2

2

通过指定循环变量的类型,您可以将数组中的每个元素显式拆箱/强制转换为该类型。

在字符串的情况下,它是从对象到字符串的强制转换。
如果您的数组是一个 int 数组,您将执行拆箱操作而不是强制转换。

于 2012-09-19T07:35:44.633 回答
0

编译器知道您正在传入 a System.Array,这是一个object基于 - 的集合。它不能静态地知道数组包含什么样的对象,因此无法确保代码在一般情况下运行时不会出错。强制转换int必须在运行时执行并且可能会失败。

于 2012-09-19T07:36:36.073 回答