来自 String.Format() 的意外行为

本文关键字:意外 String Format 来自 | 更新日期: 2023-09-27 18:34:36

给定以下代码,我希望结果为空或异常:

String.Format(null, "Hello")

相反,结果是字符串"Hello"。这是为什么呢?

来自 String.Format() 的意外行为

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

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 转换为 object(:

public static string Format(string format, object arg0)

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

String.Format(null, 5);

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

您可以阅读有关在 msdn 上选择最佳函数成员的详细信息。

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

如果您想要一个空的结果,请使用String.Empty