鉴于以下代码,我希望得到一个空结果或异常:
String.Format(null, "Hello")
相反,结果是字符串“Hello”。为什么是这样?
它之所以有效,是因为它选择了这个重载:
public static String Format( IFormatProvider provider, String format, params Object[] args) { ... }
提供null
者是可以的,可变参数没有参数也是可以的,所以它只是打印出字符串。
直觉上,我们可能已经预料到这种重载:
public static String Format(String format, Object arg0) { ... }
当然,如果它确实选择了那个,我们会得到一个ArgumentNullException
.
它选择重载
public static string Format(IFormatProvider provider, string format, params object[] args)
因为您的第二个参数的类型为string
(不需要转换)。因此,这个重载比带有两个参数的重载更接近(它需要从string
to转换object
):
public static string Format(string format, object arg0)
您可以通过调用来查看差异:
String.Format(null, 5);
在这种情况下,选择转换为 object 并且您有一个例外(实际上int
and之间没有隐式转换string
)。
您可以在 msdn上阅读有关选择最佳功能成员的更多信息。
它可能会将请求解释为对 String.Format(IFormatProvider provider, string format, params object[] args) 覆盖的调用,并将 null 作为提供者和参数,但将“Hello”作为格式,从而返回“Hello” .
如果你想要一个空的结果使用String.Empty