3

鉴于以下代码,我希望得到一个空结果或异常:

String.Format(null, "Hello")

相反,结果是字符串“Hello”。为什么是这样?

4

3 回答 3

10

它之所以有效,是因为它选择了这个重载:

public static String Format( IFormatProvider provider, String format, params Object[] args) { ... }

提供null者是可以的,可变参数没有参数也是可以的,所以它只是打印出字符串。

直觉上,我们可能已经预料到这种重载:

public static String Format(String format, Object arg0) { ... }

当然,如果它确实选择了那个,我们会得到一个ArgumentNullException.

于 2012-05-16T21:45:51.203 回答
4

它选择重载

public static string Format(IFormatProvider provider, string format, params object[] args)

因为您的第二个参数的类型为string(不需要转换)。因此,这个重载比带有两个参数的重载更接近(它需要从stringto转换object):

public static string Format(string format, object arg0)

您可以通过调用来查看差异:

String.Format(null, 5);

在这种情况下,选择转换为 object 并且您有一个例外(实际上intand之间没有隐式转换string)。

您可以在 msdn上阅读有关选择最佳功能成员的更多信息。

于 2012-05-16T21:51:56.597 回答
2

它可能会将请求解释为对 String.Format(IFormatProvider provider, string format, params object[] args) 覆盖的调用,并将 null 作为提供者和参数,但将“Hello”作为格式,从而返回“Hello” .

如果你想要一个空的结果使用String.Empty

于 2012-05-16T21:47:32.420 回答