120
Convert.ToString(null)

戻り値

null

私の期待通りに。

しかし

Convert.ToString(null as object)

戻り値

""

これらが異なるのはなぜですか?

4

2 に答える 2

148

ここで作用するオーバーロードが 2 つありToStringます。

Convert.ToString(object o);
Convert.ToString(string s);

C# コンパイラは基本的に、入力で動作する最も具体的なオーバーロードを選択しようとします。値は、任意のnull参照型に変換できます。この場合stringはより具体的でobjectあるため、勝者として選択されます。

では、null as object式の型を として固めましたobject。これは、オーバーロードとの互換性がなくなり、互換性のある唯一のオーバーロードが残っているためstring、コンパイラがオーバーロードを選択することを意味します。object

このタイ ブレークがどのように機能するかについての非常に複雑な詳細は、C# 言語仕様のセクション 7.4.3 で説明されています。

于 2012-04-27T18:13:16.030 に答える
65

JaredPar の優れたオーバーロード解決の回答に続いて、 「なぜConvert.ToString(string)null をConvert.ToString(object)返すのに、なぜ返すのか」という疑問が残りstring.Emptyます。

そして、それに対する答えは...ドキュメントがそう言っているからです:

Convert.ToString(string) は、「指定された文字列インスタンス。実際の変換は実行されません」を返します。

Convert.ToString(object) は、「値の文字列表現、または値が null の場合は String.Empty」を返します。

編集:これが「仕様のバグ」、「非常に悪いAPI設計」、「なぜこのように指定されたのか」などであるかどうかについて-表示されない理由の根拠を調べますそれは大したことです。

  1. System.Convertには、すべての基本型をそれ自体に変換するメソッドがあります。これは奇妙です - 変換が必要ないか、または可能でないため、メソッドはパラメーターを返すだけになります。Convert.ToString(string)同じように振る舞います。これらはコード生成シナリオのためにここにあると思います。
  2. Convert.ToString(object)渡されたとき、 は 3 つの選択肢がありnullます。スローするか、null を返すか、string.Empty を返します。投げることは悪いことです - 二重に、これらが生成されたコードに使用されることを前提としています。null を返すには、呼び出し元が null チェックを行う必要があります。繰り返しになりますが、生成されたコードでは適切な選択ではありません。string.Empty を返すことは合理的な選択のようです。残りの部分はSystem.Convert、デフォルト値を持つ値型を扱います。
  3. null を返すことがより「正しい」かどうかは議論の余地がありますが、 string.Empty の方が間違いなく使いやすいです。変更Convert.ToString(string)とは、「実際の変換なし」ルールを破ることを意味します。は静的ユーティリティ クラスであるためSystem.Convert、各メソッドを論理的に独自のものとして扱うことができます。この動作が「驚くべき」ものになる現実世界のシナリオはほとんどないため、(可能性のある) 正確さよりも使いやすさを優先してください。
于 2012-04-27T18:30:33.323 に答える