使用数组作为 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]}";
尝试使用数组作为 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]}";