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