如果您能理解以下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[]
阵列