Страницы

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

суббота, 14 декабря 2019 г.

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

#c_sharp #строки


Этот код:

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


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

А здесь:

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


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

З.Ы.

А эти примеры

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


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


Ответы

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

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

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