将String.Format()与DateTime数组一起使用时出现问题



如果您能理解以下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提供程序,字符串格式,ParamsArray参数(位于System.String.FormatHelper(IFormatProvider提供程序,字符串格式,ParamsArray参数(在System.String.Format(字符串格式,对象arg0(在Program.Main((:第15行

我本以为接受对象数组的String.Format重载可以像处理字符串数组一样处理DateTime数组,但我是否误解了什么?

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)
};

它应该起作用。

var format = "{0:MMM}{1:MMM}";需要为string.Format()提供三个参数——一个用于格式,两个用于值。

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

另一种选择是将阵列从DateTime[]更改为object[]阵列

最新更新