只需反编译代码即可了解其运作方式。
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[]
的转换进行比较。将null
转换为Object[]
被认为是“更好”的,因为存在从Object[]
到Object
的转换,但反之不成立。这与我们如果有:
Foo(String)
Foo(Object)
并调用 Foo(null)
,它将选择 Foo(String)
。
因此,您的原始代码等效于:
object[] values = null;
string.Format("{0}", values);
现在,希望您如文档所述,会得到一个ArgumentNullException
异常。
\0
。 </猜测> - SpaceBison