【问题标题】:Using an array as argument for string.Format()使用数组作为 string.Format() 的参数
【发布时间】:2016-11-30 09:57:46
【问题描述】:

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

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

代码如下:

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

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

是什么导致了这个错误?

infoText.text 只是一个普通的字符串对象)

【问题讨论】:

  • 您传递的是 int[] 而不是 string[]
  • 可能类似于 string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", place[0], place[1], place[2], place[3]); 它在传递与字符串中每个 {} 相关的对象时起作用
  • 只是为了记录,而不是使用 string.format,您可以更动态地创建字符串,而无需硬编码播放器的数量,例如:infoText.text = string.Join("\n", place.Select((p,i) => $"Player{i+1}: {p}"));
  • @Me.Name 看起来真不错。我会试试的。谢谢!

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


【解决方案1】:

您可以使用 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 以供参考。

【讨论】:

  • 所以参数可以是string[]数组,但不能是int[]数组?
  • @martin36 不仅是string[] - 你的数组应该是一个对象或字符串类型。
【解决方案2】:

快速修复。

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

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

【讨论】:

  • C#是否支持协变数组转换(例如从string[]object[]),但在这种情况下,转换还涉及值的装箱类型 这就是它不起作用的原因。
  • @Joey:他写的“不支持从int[]到object[]的协变数组转换” ;-)
【解决方案3】:

可以为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};

【讨论】:

  • params object[] 和普通的object[] 数组有什么区别?
  • @martin36:您可以将params 参数视为任意数量的参数。编译器会自动将它们包装在一个数组中以调用该方法。
【解决方案4】:

正如其他人已经说过的,您不能将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]}";

【讨论】:

  • 我正在使用 Unity,它只有 C# 2 版本。
  • 哦,抱歉,不过还是感谢您的回答。我会记住它以备后用。
  • @martin36 没问题,这对其他读者也可能是一个有用的建议:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2010-11-28
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多