Подтвердить что ты не робот

String.Format не работает во время выполнения с массивом целых чисел

Рассмотрим string.Format(), параметры которого являются строкой и, в частности, в списке перегрузки, object[] или многими объектами.

Это утверждение преуспевает:

string foo = string.Format("{0} {1}", 5, 6);

как это делает:

object[] myObjs = new object[] {8,9};
string baz = string.Format("{0} and {1}", myObjs;

как и массив строк:

string[] myStrings = new string[] {"abc", "xyz"};
string baz = string.Format("{0} {1}", myStrings);

Кажется, что целые числа, если они указаны отдельно, могут быть помещены в ящик или принудительно введены для ввода object, который, в свою очередь, принуждается к строке.

Этот оператор не работает в время выполнения.

int[] myInts = new int[] {8,9};
string bar = string.Format("{0} and {1}", myInts);

Индекс (основанный на нуле) должен быть больше или равен нулю и меньше размера списка аргументов.

  • Почему массив int не может или не может быть принужден или помечен в поле object[] или string[]?
  • Из небольшого количества любопытства, почему компилятор не поймал это?
4b9b3361

Ответ 1

Сбой по той же причине приведет к сбою:

string foo = string.Format("{0} {1}", 5);

Вы указываете два аргумента в format, но указываете только один объект.

Компилятор не поймает его, потому что int[] передается как объект, который является вполне допустимым аргументом для функции.

Также обратите внимание, что ковариация массива не работает со значениями типов, поэтому вы не можете делать:

object[] myInts = new int[] {8,9};

Однако вы можете сойти с рук:

object[] myInts = new string[] { "8", "9" };
string bar = string.Format("{0} {1}", myInts);

который будет работать, потому что вы будете использовать перегрузку String.Format, которая принимает object[].

Ответ 2

Ваш перевод будет переведен следующим образом:

string foo = string.Format("{0} {1}", myInts.ToString());

который приводит к этой строке:

string foo = "System.Int32[] {1}";

Так как {1} не имеет параметра, он выдает исключение

Ответ 3

Я думаю, что у концепции, с которой вы столкнулись, почему int[] не передается в object[]. Вот пример, который показывает, почему это было бы плохо.

int[] myInts = new int[]{8,9};
object[] myObjs = (object[])myInts;
myObjs[0] = new object();

Проблема заключается в том, что мы просто добавили объект в массив int.

Итак, что происходит в вашем коде, так это то, что myInts передается в object, и у вас нет второго аргумента для заполнения {1}

Ответ 4

Ваш string.Format ожидает 2 аргумента ({0} и {1}). Вы только поставляете 1 аргумент (int []). Вам нужно что-то большее:

string bar = string.Format("{0} and {1}", myInts[0], myInts[1]);

Компилятор не замечает проблему, потому что строка формата оценивается во время выполнения. IE Компилятор не знает, что {0} и {1} означают, что должно быть 2 аргумента.

Ответ 5

Это работает:

string bar = string.Format("{0} and {1}", myInts[0], myInts[1]);

Компилятор не поймает его, потому что он не оценивает вашу строку формата.

Пример, который вы оставили сверху, не соответствует тому, что вы пытаетесь сделать ниже... вы предоставили два {} и два аргумента, но в нижней части вы предоставили только один аргумент.