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[]
?
- Из небольшого количества любопытства, почему компилятор не поймал это?
Ответы
Ответ 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]);
Компилятор не поймает его, потому что он не оценивает вашу строку формата.
Пример, который вы оставили сверху, не соответствует тому, что вы пытаетесь сделать ниже... вы предоставили два {} и два аргумента, но в нижней части вы предоставили только один аргумент.