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