如果我运行此代码:
Console.WriteLine( String.Format( "{0}", null ) );
我得到ArgumentNullException
,但如果我运行此代码:
String str = null;
Console.WriteLine( String.Format( "{0}", str ) );
它运行得很好,输出是一个空字符串。
现在两件作品相当于我 - 他们都将空引用传递给String.Format()
但行为却不同。
这里有什么不同的行为?
答案 0 :(得分:76)
只需反编译代码即可了解正在进行的操作。
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)
,它会选择Foo(String)
。
所以你的原始代码相当于:
object[] values = null;
string.Format("{0}", values);
此时,根据文档,希望您期待 ArgumentNullException
。