3

次のコードを考えると、空の結果または例外が予想されます。

String.Format(null, "Hello")

代わりに、結果は文字列 "Hello" になります。どうしてこれなの?

4

3 に答える 3

10

このオーバーロードを選択しているため、機能しています:

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

nullプロバイダーは問題ありません。varargs への引数も問題ないため、文字列を出力するだけです 。

直感的に、この過負荷を予想していたかもしれません:

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

そしてもちろん、それを選択した場合ArgumentNullException、 .

于 2012-05-16T21:45:51.203 に答える
4

過負荷を選択します

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で最適な関数メンバーを選択する方法の詳細を読むことができます。

于 2012-05-16T21:51:56.597 に答える
2

リクエストを String.Format(IFormatProvider provider, string format, params object[] args) オーバーライドの呼び出しとして解釈し、プロバイダーとパラメーターとして null を取得しますが、形式として「Hello」を取得し、「Hello」を返す可能性があります。 .

空の結果が必要な場合は、String.Empty

于 2012-05-16T21:47:32.420 に答える