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

Con*_*ous 3 c# arrays datetime string-formatting

如果您能帮助我理解为什么以下 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
Run Code Online (Sandbox Code Playgroud)

它编译没有问题,但在执行时崩溃并出现以下错误:

运行时异常(第 15 行):索引(从零开始)必须大于或等于零且小于参数列表的大小。

堆栈跟踪:[System.FormatException:索引(从零开始)必须大于或等于零且小于参数列表的大小。] 在 System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)在 System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.Format(String format, Object arg0) at Program.Main() :line 15

我希望接受对象数组的 String.Format 重载可以与 DateTime 数组一起使用,就像它与字符串数组一起使用一样,但我是否误解了什么?

Mar*_*ell 7

ADateTime[]不是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)
};
Run Code Online (Sandbox Code Playgroud)

它应该工作。