我是一名有用的助手,可以为您翻译文本。
我和同事一起做一些基础的C#教程时,遇到了一个我们认为很有趣的难题。
以下代码按预期工作:
您会收到一个格式异常(
如果我们切换到更明显的方式:
我和同事一起做一些基础的C#教程时,遇到了一个我们认为很有趣的难题。
以下代码按预期工作:
string[] strings = { "1", "2", "3" };
Console.WriteLine("{0}, {1}, {2}", strings);
它获取字符串数组并使用 Console.WriteLine(string format, params object[] arg)
方法的重载将字符串 "1, 2, 3" 打印到控制台。
然而,以下代码无法正常工作:
int[] ints = { 1, 2, 3 };
Console.WriteLine("{0}, {1}, {2}", ints);
您会收到一个格式异常(
FormatException
),其中包含消息:索引(从零开始)必须大于或等于零,且小于参数列表的大小。
使用 IntelliSense,可以看到它正在尝试使用 Console.WriteLine(string format, object arg0)
重载,这就是为什么我们会收到该消息的原因,它没有将 ints
视为数组,尽管显然它确实是一个数组。如果我们切换到更明显的方式:
int[] ints = { 1, 2, 3 };
Console.WriteLine("{0},{1},{2}", ints[0], ints[1], ints[2]);
它再次工作并再次使用params object[]
重载。
为什么该方法无法将int[]
视为数组? Int32
是一个结构体是否有所不同?如果是这样,为什么?
编辑
我进行了一个快速测试,测试了相同格式的双精度浮点数,但它们也不能正常工作,这使我认为确实是类型是结构体的事实,但我仍然不明白为什么会有所不同。
string[]
->object[]
。但是对于int[]
->object[]
,不存在这样的转换。是因为int
是值类型。 - user4003407