只需反编译代码即可了解发生了什么。
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)
希望很明显为什么最后三个选项无效。
为了确定使用前两个中的哪一个,编译器将转换 from null
toObject
与转换 from null
to进行比较Object[]
。转换为Object[]
被认为是“更好”,因为存在从Object[]
to的转换Object
,但反之则不然。这与如果我们有相同的逻辑:
Foo(String)
Foo(Object)
并打电话Foo(null)
,它会接Foo(String)
。
所以你的原始代码相当于:
object[] values = null;
string.Format("{0}", values);
在这一点上,希望您期望-根据ArgumentNullException
文档。