String.Format()的意外行为

时间:2012-05-16 21:42:25

标签: c# string

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

String.Format(null, "Hello")

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

3 个答案:

答案 0 :(得分:10)

这是有效的,因为它选择了这个重载:

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

null提供程序是正常的,并且varargs的参数也没有,所以它只打印出字符串。

直观地说,我们可能已经预料到这种过载:

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

当然,如果 选择,我们就会得到ArgumentNullException

答案 1 :(得分:4)

选择过载

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。

上选择best function member的更多信息

答案 2 :(得分:2)

它可能将请求解释为对String.Format的调用(IFormatProvider提供程序,字符串格式,params object [] args)覆盖并将null作为提供程序和params但是“Hello”作为格式,从而返回“你好”。

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