2012-05-16 153 views
4

考虑下面的代码,我希望到一个空的结果或异常:意外的行为()

String.Format(null, "Hello") 

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

回答

10

它的工作,因为它选择这个过载:

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

一个null供应正常,且无参数的可变参数也行,所以它只是打印出的字符串。

直观地说,我们可能会认为此重载:

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

当然,如果它选择,我们会得到一个ArgumentNullException

2

它可能会将请求解释为对String.Format(IFormatProvider提供程序,字符串格式,params对象[] args)的调用,并将空值作为提供程序和参数,但将“Hello”作为格式进行覆盖。返回“你好”。

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

4

它选择超载

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

,因为你的第二个参数有string型(无需转换)。因此,该过载更接近,比具有两个参数的过载(它需要从stringobject转换):

String.Format(null, 5); 

在这种情况下转换为一个对象是:

public static string Format(string format, object arg0) 

可以通过调用看到差异选择,你有一个例外(实际上没有在intstring之间的隐式转换)。

您可以在msdn上选择best function member了解更多信息。