Почему я получаю исключение при передаче константы "null", но не при передаче ссылки на строку" null"?


если я запускаю этот код:

Console.WriteLine( String.Format( "{0}", null ) );

Я ArgumentNullException но если я запускаю этот код:

String str = null;
Console.WriteLine( String.Format( "{0}", str ) );

он работает нормально и возвращает пустую строку.

теперь две части выглядят эквивалентно мне - они оба передают нулевую ссылку в String.Format() но поведение отличается.

как id различное поведение возможно здесь?

1 59

1 ответ:

просто декомпилируйте код, чтобы понять, что происходит.

string.Format("{0}", null)

называет конкретные применимая перегрузка, которая string.Format(string, object[]).

перегрузки string.Format являются:

Format(String, Object)
Format(String, Object[])
Format(IFormatProvider, String, Object[])
Format(String, Object, Object)
Format(String, Object, Object, Object)

надеюсь, это очевидно, почему последние три варианта недействительны.

чтобы решить, какой из первых двух использовать, компилятор сравнивает преобразование с null до Object для преобразования из null to Object[]. Преобразование в Object[] считается "лучше", потому что есть преобразование из Object[] до Object, но не наоборот. Это та же логика, по которой если бы мы имели:

Foo(String)
Foo(Object)

и позвонил Foo(null), он хотел забрать Foo(String).

таким образом, ваш исходный код эквивалентен:

object[] values = null;
string.Format("{0}", values);

в этот момент, надеюсь, вы бы ожидал an ArgumentNullException - согласно документации.