使用数组作为string.Format()的参数

时间:2016-11-30 09:57:46

标签: c# .net arrays string string-formatting

当尝试使用数组作为string.Format()方法的参数时,我收到以下错误:

  

FormatException:Index(从零开始)必须大于或等于零且小于参数列表的大小。

代码如下:

place = new int[] { 1, 2, 3, 4};
infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", place);

数组包含四个值,String.Format()中的参数也相同。

导致此错误的原因是什么?

infoText.text只是一个常规的String对象)

4 个答案:

答案 0 :(得分:8)

快速修复。

var place = new object[] { 1, 2, 3, 4 };

C#不支持从int[]object[]的共变阵列转换,因此整个数组被视为object,因此调用带有单个参数的this overload。< / p>

答案 1 :(得分:6)

您可以将int数组转换为字符串数组,然后传递它。

infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", 
                              place.Select(x=>x.ToString()).ToArray());

答案 2 :(得分:5)

可以为params参数传递显式数组,但它必须具有匹配类型。 string.Format有一些重载,其中以下两个对我们很有意思:

string.Format(string, params object[])
string.Format(string, object)

在您的情况下,将int[]视为object是唯一有效的转换,因为int[]无法隐式(或明确)转换为object[],因此{ {1}}看到四个占位符,但只有一个参数。您必须声明正确类型的数组

string.Format

答案 3 :(得分:3)

正如其他人已经说过的那样,您无法将int[]转换为object[]。但您可以使用Enumerable.Cast<T>()修复此问题:

infoText.text = string.Format
(
      "Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}",                        
      place.Cast<object>().ToArray()
);

顺便说一句,如果您使用C#6或更高版本,您可以考虑使用插值字符串而不是string.Format

infoText.text = $"Player1: {place[0]}\n Player 2: {place[1]} \n Player 3: {place[2]} \n Player 4: {place[3]}";