考虑以下代码,我期望得到一个空结果或者异常:
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
转换为object
):
public static string Format(string format, object arg0)
通过调用可以看到差异:
String.Format(null, 5);
int
和string
之间不存在隐式转换)。