次のコードを考えると、空の結果または例外が予想されます。
String.Format(null, "Hello")
代わりに、結果は文字列 "Hello" になります。どうしてこれなの?
このオーバーロードを選択しているため、機能しています:
public static String Format( IFormatProvider provider, String format, params Object[] args) { ... }
null
プロバイダーは問題ありません。varargs への引数も問題ないため、文字列を出力するだけです 。
直感的に、この過負荷を予想していたかもしれません:
public static String Format(String format, Object arg0) { ... }
そしてもちろん、それを選択した場合ArgumentNullException
、 .
過負荷を選択します
public static string Format(IFormatProvider provider, string format, params object[] args)
2番目の引数のタイプがstring
(変換は不要)であるためです。したがって、この過負荷は、2つのパラメーターを使用した過負荷よりも近くなります(からstring
への変換が必要object
です)。
public static string Format(string format, object arg0)
次のように呼び出すと、違いがわかります。
String.Format(null, 5);
この場合、オブジェクトへの変換が選択され、例外があります(実際には、との間int
に暗黙の変換はありませんstring
)。
msdnで最適な関数メンバーを選択する方法の詳細を読むことができます。
リクエストを String.Format(IFormatProvider provider, string format, params object[] args) オーバーライドの呼び出しとして解釈し、プロバイダーとパラメーターとして null を取得しますが、形式として「Hello」を取得し、「Hello」を返す可能性があります。 .
空の結果が必要な場合は、String.Empty