59

このコードを実行すると:

Console.WriteLine( String.Format( "{0}", null ) );

しかし、ArgumentNullExceptionこのコードを実行すると:

String str = null;
Console.WriteLine( String.Format( "{0}", str ) );

それは問題なく実行され、出力は空の文字列です。

これで、2 つの部分は私と同等に見えます。どちらも null 参照を渡しますString.Format()が、動作は異なります。

ここでどのように異なる動作が可能ですか?

4

1 に答える 1

76

コードを逆コンパイルして、何が起こっているのかを理解してください。

string.Format("{0}", null)

は、適用可能な最も具体的string.Format(string, object[])なオーバーロードを呼び出します。これはです。

のオーバーロードは次のstring.Formatとおりです。

Format(String, Object)
Format(String, Object[])
Format(IFormatProvider, String, Object[])
Format(String, Object, Object)
Format(String, Object, Object, Object)

最後の 3 つのオプションが無効である理由が明らかであることを願っています。

最初の 2 つのどちらを使用するかを決定するために、コンパイラは からへの変換と から への変換nullを比較します。からへの変換があるため、 への変換は「より良い」と見なされますが、その逆はありません。これは、次の場合と同じロジックです。ObjectnullObject[]Object[]Object[]Object

Foo(String)
Foo(Object)

と呼ばれるとFoo(null)、それは を選びFoo(String)ます。

したがって、元のコードは次と同等です。

object[] values = null;
string.Format("{0}", values);

この時点で、ドキュメンテーションに従って -が期待されることを願っています。ArgumentNullException

于 2012-12-14T11:16:19.563 に答える