Почему я получаю исключение при передаче константы "null", но не при передаче ссылки на строку" null"?
если я запускаю этот код:
Console.WriteLine( String.Format( "{0}", null ) );
Я ArgumentNullException но если я запускаю этот код:
String str = null;
Console.WriteLine( String.Format( "{0}", str ) );
он работает нормально и возвращает пустую строку.
теперь две части выглядят эквивалентно мне - они оба передают нулевую ссылку в String.Format() но поведение отличается.
как id различное поведение возможно здесь?
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для преобразования изnulltoObject[]. Преобразование вObject[]считается "лучше", потому что есть преобразование изObject[]доObject, но не наоборот. Это та же логика, по которой если бы мы имели:Foo(String) Foo(Object)и позвонил
Foo(null), он хотел забратьFoo(String).таким образом, ваш исходный код эквивалентен:
object[] values = null; string.Format("{0}", values);в этот момент, надеюсь, вы бы ожидал an
ArgumentNullException- согласно документации.