2012-05-16 215 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瞭解更多信息。