Проблема с использованием String.Format () с массивом DateTime - PullRequest
2 голосов
/ 31 марта 2020

Буду признателен за помощь в понимании того, почему следующий код 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, формат String, аргументы ParamsArray) в System.String .FormatHelper (поставщик IFormatProvider, формат String, аргументы ParamsArray) в System.String.Format (формат String, Object arg0) в Program.Main (): строка 15

Я ожидал, что Перегрузка String.Format, которая принимает массив объектов , будет работать с массивом DateTime так же, как он работает с массивом строк, но я что-то неправильно понимаю? * 101 6 *

Ответы [ 2 ]

5 голосов
/ 31 марта 2020

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

и оно должно работать.

1 голос
/ 31 марта 2020

var format = "{0:MMM}{1:MMM}"; ожидает три аргумента для string.Format() - один для формата и два аргумента для значений.

Как

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

другой вариант - изменить массив с DateTime[] на object[] массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...