给出以下代码:
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?
答案 0 :(得分:2)
通过指定循环变量的类型,您明确地将数组中的每个元素拆箱/转换为该类型。
对于字符串,它是从对象到字符串的强制转换 如果你的数组是一个int数组,你将进行拆箱操作而不是强制转换。
答案 1 :(得分:0)
编译器知道您传入System.Array
,这是一个基于object
的集合。它无法静态地知道数组包含哪种对象,因此在一般情况下无法保证代码在没有错误的情况下运行。转换为int
必须在运行时执行,并且可能会失败。