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

Using an array as argument for string.Format()

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

FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

代码如下:

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 只是一个普通的字符串对象)

快速修复。

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

C# 不支持从 int[]object[] 的协变数组转换,因此整个数组被视为 object,因此调用具有单个参数的 this overload .

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

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

在您的情况下,将 int[] 视为 object 是唯一有效的转换,因为 int[] 不能隐式(或显式)转换为 object[],所以 string.Format 看到四个占位符,但只有一个参数。您必须声明正确类型的数组

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

您可以使用 System.Linq Select() 扩展方法将 int 数组转换为字符串数组。

infoText.text = string.Format("Player1: {0} \nPlayer2: {1} \nPlayer3: {2} \nPlayer4: {3}", 
                              place.Select(x => x.ToString()).ToArray());

编辑:

在 C# 6 及更高版本中,您还可以使用 String Interpolation 而不是 string.Format()

infoText.text = $"Player1: {place[0]}\nPlayer2: {place[1]} \nPlayer3: {place[2]} \nPlayer4: {place[3]}";

检查此 fiddle 供您参考。

正如其他人所说,您无法将 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]}";