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