【发布时间】:2011-09-13 18:00:31
【问题描述】:
这是一个关于为什么编译器在传递空文字作为参数时选择某个重载的问题,由 string.Format 重载证明。
当对 args 参数使用空文字时,string.Format 会抛出 ArgumentNullException。
string.Format("foo {0}", null);
Format 方法有一些重载。
string.Format(string, object);
string.Format(string, object[]);
string.Format(IFormatProvider, string, object[]);
通过反编译代码运行,从第二种方法抛出空文字 args 的异常。但是,以下示例调用上面的第一个方法(如预期的那样),然后调用第二个方法,该方法调用第三个方法,最终只返回“foo”。
string x = null;
string.Format("foo {0}", x);
string y;
string.Format("foo {0}", y = null);
但是string.Format("foo {0}", null) 调用了上面的第二个方法并导致了一个空异常。在这种情况下,为什么编译器会决定 null 文字匹配第二个方法签名而不是第一个?
【问题讨论】:
-
如果这包含更一般意义上的可变参数(如果它不是 string.Format 特定的),也许可以扩大标题/范围...
-
Pete,您可能已经意识到这一点(这不是您问题的答案),但尽管我会提到它;为避免此异常,您可以使用
String.Format("Testing {0}", String.Empty);。一切顺利。 -
重复问题:stackoverflow.com/q/5173339/25727。简而言之:重载决议更喜欢更具体的类型。所以它选择了数组,因为
object是 .NET 中最不确定的类型。 -
@Jan:这是否也解释了为什么其他两个示例选择 object 而不是 object[]?
-
在您的其他两个示例中,不能使用带有
object[]参数的重载,因为在这种情况下,string不是object[]并且参数的类型是string。