String.Format() 的行为出现了意外情况

3

考虑以下代码,我期望得到一个空结果或者异常:

String.Format(null, "Hello")

相反,结果是字符串"Hello"。这是为什么?
3个回答

10

这个能够正常工作是因为它选择了这个重载方法:

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

一个null提供者是可以的,而对于可变参数没有参数也是可以的,因此它只会打印出字符串。

直观地说,我们可能期望有这种重载:

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

当然,如果它确实选择了那样做,我们将会得到一个ArgumentNullException异常。


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 上阅读有关选择 最佳函数成员 的更多信息。

2
可能会将请求解释为对String.Format(IFormatProvider provider, string format, params object[] args)重载的调用,并将null作为提供程序和params,但将"Hello"作为格式,因此返回"Hello"。如果您想要一个空结果,请使用String.Empty。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接