当尝试使用数组作为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对象)
答案 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]}";