为什么在传递“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) 

希望很明显为什么最后三个选项是无效的。

要计算出使用前两个中的哪一个,编译器将从nullObject的转换与从nullObject[]的转换进行比较。 Object[]的转换被认为是“更好的”,因为存在从Object[]Object的转换,反之亦然。 如果我们有这样的逻辑,也是一样的:

 Foo(String) Foo(Object) 

并调用Foo(null) ,它会selectFoo(String)

所以你的原始代码相当于:

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

在这一点上,希望你会期望一个ArgumentNullException – 根据文档。