String.Format Argument Null Exception

В приведенном ниже коде будет выведено исключение Argument Null Exception

var test = string.Format("{0}", null); 

Однако это вернет пустую строку

string something  = null; 
var test = string.Format("{0}", something); 

Просто любопытно узнать, почему вторая часть кода не вызывает исключение. Это ошибка?

Ответ 1

Разница в том, что первая часть кода вызывает string.Format(string, object[])... тогда как вторая часть кода вызывает string.Format(string, object).

null является допустимым аргументом для второго метода (он должен был считаться значением для первого заполнителя), но не первым (где null обычно представляет собой массив заполнителей). В частности, сравните документацию, когда вызывается NullArgumentException:

string.Format(string, object):
формат null

Но:

string.Format(string, object[]):
формат или args null

Подумайте о string.Format(string, object) как о реализации чего-то вроде:

public static string Format(string format, Object arg0)
{
    return string.Format(format, new object[] { arg0 } );
}

Итак, после немного замены ваш код ближе к:

// Broken code
object[] args = null; // No array at all
var test = string.Format("{0}", args); 

// Working code
object[] args = new object[] { null }; // Array with 1 value
var test = string.Format("{0}", args); 

Ответ 2

Второй фрагмент кода вызывает следующую перегрузку:

Format(String, Object)

Здесь значение может быть нулевым, как указано в документации.

В первом фрагменте кода используется следующая перегрузка:

Format(String, Object[])  

Здесь второе значение не может иметь значение null, как указано в документации.

Ответ 3

Небольшая точка, не упомянутая существующими ответами, и почти делает вопрос спорным:

Полное сообщение для ArgumentNullException:

Значение не может быть нулевым.
Имя параметра: args

Также здесь проблема null имеет любой тип. Явное приведение его к string или object (или использование функции С# default()) позволило бы избежать проблемы.