为什么在传递“null”常量时会出现异常,但在传递“null”字符串引用时却没有?

时间:2012-12-14 11:10:28

标签: c# .net reference argumentnullexception

如果我运行此代码:

Console.WriteLine( String.Format( "{0}", null ) );

我得到ArgumentNullException,但如果我运行此代码:

String str = null;
Console.WriteLine( String.Format( "{0}", str ) );

它运行得很好,输出是一个空字符串。

现在两件作品相当于我 - 他们都将空引用传递给String.Format()但行为却不同。

这里有什么不同的行为?

1 个答案:

答案 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)

希望最后三个选项无效的原因很明显。

要计算出前两个中的哪一个使用,编译器会将nullObject的转换与从nullObject[]的转换进行比较。转换为Object[]被视为"更好"因为有从Object[]Object的转换,但反之亦然。如果有的话,这就是同样的逻辑:

Foo(String)
Foo(Object)

并调用Foo(null),它会选择Foo(String)

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

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

此时,根据文档,希望您期待 ArgumentNullException