如果我运行这段代码:
Console.WriteLine( String.Format( "{0}", null ) );
我得到一个ArgumentNullException
,但是如果我运行下面的代码:
String str = null;
Console.WriteLine( String.Format( "{0}", str ) );
它运行得很好,输出是一个空字符串。
现在,这两段代码看起来和我一样--它们都向String.Format()
传递了一个空引用,但行为却不同。
这里怎么可能有不同的行为呢?
发布于 2012-12-14 19:16:20
只要反编译代码就能搞清楚到底是怎么回事。
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
-根据文档。
https://stackoverflow.com/questions/13877501
复制相似问题