String.Format с null параметром

282
09 сентября 2018, 01:20

Этот код:

Console.Write(string.Format("Value = {0}", (object)null));

не вызывает исключение

А здесь:

Console.Write(string.Format("Value = {0}", null));

будет исключение Значение не может быть неопределенным.. Почему?

З.Ы.

А эти примеры

Console.Write($"Value = {null}");
Console.Write($"Value = {(object)null}");

не вызовут исключений

Answer 1

Напомню, что передача произвольного числа аргументов в string.Format реализуется через params object[] args. Особенностью такой записи является то, что если передать вместо множества аргументов ровно один, который можно привести к типу object[] - компилятор приведет его к этому типу, иначе компилятор создаст новый массив.

Соответственно, когда вторым аргументом передается null - этот null принимает тип массива объектов, отсюда и ошибка. Второй параметр string.Format не может быть null.

В то же время, если написать (object)null - то в качестве массива его передать уже не получится, и компилятор за кулисами сделает вот так: new object[] { (object)null }, а этот вариант совершенно корректен.

Поправка: на самом деле компилятор выберет перегрузку Format(string, object) вместо создания массива - но это просто оптимизация

Точно так же будет работать и вот такой вариант: string.Format("Value = {0}", null, null), потому что два аргумента никак не могут быть одним массивом.

Что же до варианта с интерполяцией - у него нет синтаксической неоднозначности, а потому любой вариант работает.

READ ALSO
Unity: Проблема с авторизацией в play game service

Unity: Проблема с авторизацией в play game service

Проблема с авторизацией в play game service: У меня выходит ошибка:

241
c# ZedGraph: Динамическое прокручивание графика

c# ZedGraph: Динамическое прокручивание графика

График постоянно получает данныеИх может быть очень много

272
Замечание на sonar: “Refactor your code not to use hardcoded absolute paths or URIs.”

Замечание на sonar: “Refactor your code not to use hardcoded absolute paths or URIs.”

Имею проблему с указанием путей к файлам в WPF приложенииИзображение приложение находит только, когда они прописаны вот так:

257
Программа должна печатать ромб одним из значков (* или + или #)

Программа должна печатать ромб одним из значков (* или + или #)

Компилятор никакой ошибки не выдает, но массив не печатаетЧто не так?

659