使用DateTime数组时,使用String.Format()出现问题

3

我希望您能帮助我理解下面的C#代码为什么无法工作。

//string[] array = new string[] { "a", "b", "c", "d" }; // this array works
var array = new [] {
       new DateTime(2000, 1, 1),
       new DateTime(2010, 12, 31)
};

var format = "{0:MMM}{1:MMM}";

Console.WriteLine(string.Format(format, array)); // compiles, but crashes at runtime

编译没有问题,但在执行时出现以下错误:
运行时异常(第15行):索引(从零开始)必须大于或等于零,并且小于参数列表的大小。
堆栈跟踪:[System.FormatException:索引(从零开始)必须大于或等于零,并且小于参数列表的大小。] 在 System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args) 在 System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) 在 System.String.Format(String format, Object arg0) 在 Program.Main() :line 15
我期望接受对象数组的String.Format重载方法能够像处理字符串数组一样处理DateTime数组,但是我是否有什么误解?

这样做不起作用,因为它会将数组视为第0项,而不会有第1项,因此会出现异常。您需要更改代码以单独传递项目:string.Format(format, date1, date2) - Martin Costello
2
只是一个小细节,你不需要在 Console.WriteLine 中调用 string.Format,只需使用 Console.WriteLine(format, array); 即可。 - Pavel Anikhouski
2个回答

7
一个 DateTime[] 不是一个 object[],这不是数组的协变性工作方式;所以:如果你将一个 DateTime[] 数组传递给 string.Format,它不会使用 Format(string, object[]) 重载——事实上,你是将整个 DateTime[] 作为单个对象传递给 Format(string, object),因此从 Format 的角度来看,你只能使用标记 0
基本上,使用:
var array = new object[] {
       new DateTime(2000, 1, 1),
       new DateTime(2010, 12, 31)
};

并且它应该能够正常工作。


非常抱歉晚了,但是非常感谢,马克。这正是我所需要的。 - Conscious

1

var format = "{0:MMM}{1:MMM}"; 期望为 string.Format() 提供三个参数 - 一个用于格式化,另外两个用于值。

例如:

string.Format(format, array[0], array[1])

另一个选项是将数组从 DateTime[] 更改为 object[] 数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接