为什么在传递“null”常量时会得到一个exception,而在传递“null”string时则不会呢?
如果我运行这个代码:
Console.WriteLine( String.Format( "{0}", null ) );
我得到一个ArgumentNullException
但如果我运行此代码:
String str = null; Console.WriteLine( String.Format( "{0}", str ) );
它运行得很好,输出是一个空string。
现在这两块看起来相当于我 – 他们都通过一个空引用到String.Format()
但行为是不同的。
不同的行为如何在这里可能?
只需反编译代码就可以了解发生了什么事情。
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
到Object[]
的转换进行比较。 Object[]
的转换被认为是“更好的”,因为存在从Object[]
到Object
的转换,反之亦然。 如果我们有这样的逻辑,也是一样的:
Foo(String) Foo(Object)
并调用Foo(null)
,它会selectFoo(String)
。
所以你的原始代码相当于:
object[] values = null; string.Format("{0}", values);
在这一点上,希望你会期望一个ArgumentNullException
– 根据文档。