Страницы

Поиск по вопросам

вторник, 23 октября 2018 г.

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

Этот код:
Console.Write(string.Format("Value = {0}", (object)null));
не вызывает исключение
А здесь:
Console.Write(string.Format("Value = {0}", null));
будет исключение Значение не может быть неопределенным.. Почему?
З.Ы.
А эти примеры
Console.Write($"Value = {null}"); Console.Write($"Value = {(object)null}");
не вызовут исключений


Ответ

Напомню, что передача произвольного числа аргументов в 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), потому что два аргумента никак не могут быть одним массивом.
Что же до варианта с интерполяцией - у него нет синтаксической неоднозначности, а потому любой вариант работает.

Комментариев нет:

Отправить комментарий