Convert.ToString(null)
戻り値
null
私の期待通りに。
しかし
Convert.ToString(null as object)
戻り値
""
これらが異なるのはなぜですか?
ここで作用するオーバーロードが 2 つありToString
ます。
Convert.ToString(object o);
Convert.ToString(string s);
C# コンパイラは基本的に、入力で動作する最も具体的なオーバーロードを選択しようとします。値は、任意のnull
参照型に変換できます。この場合string
はより具体的でobject
あるため、勝者として選択されます。
では、null as object
式の型を として固めましたobject
。これは、オーバーロードとの互換性がなくなり、互換性のある唯一のオーバーロードが残っているためstring
、コンパイラがオーバーロードを選択することを意味します。object
このタイ ブレークがどのように機能するかについての非常に複雑な詳細は、C# 言語仕様のセクション 7.4.3 で説明されています。
JaredPar の優れたオーバーロード解決の回答に続いて、 「なぜConvert.ToString(string)
null をConvert.ToString(object)
返すのに、なぜ返すのか」という疑問が残りstring.Empty
ます。
そして、それに対する答えは...ドキュメントがそう言っているからです:
Convert.ToString(string) は、「指定された文字列インスタンス。実際の変換は実行されません」を返します。
Convert.ToString(object) は、「値の文字列表現、または値が null の場合は String.Empty」を返します。
編集:これが「仕様のバグ」、「非常に悪いAPI設計」、「なぜこのように指定されたのか」などであるかどうかについて-表示されない理由の根拠を調べますそれは大したことです。
System.Convert
には、すべての基本型をそれ自体に変換するメソッドがあります。これは奇妙です - 変換が必要ないか、または可能でないため、メソッドはパラメーターを返すだけになります。Convert.ToString(string)
同じように振る舞います。これらはコード生成シナリオのためにここにあると思います。Convert.ToString(object)
渡されたとき、 は 3 つの選択肢がありnull
ます。スローするか、null を返すか、string.Empty を返します。投げることは悪いことです - 二重に、これらが生成されたコードに使用されることを前提としています。null を返すには、呼び出し元が null チェックを行う必要があります。繰り返しになりますが、生成されたコードでは適切な選択ではありません。string.Empty を返すことは合理的な選択のようです。残りの部分はSystem.Convert
、デフォルト値を持つ値型を扱います。Convert.ToString(string)
とは、「実際の変換なし」ルールを破ることを意味します。は静的ユーティリティ クラスであるためSystem.Convert
、各メソッドを論理的に独自のものとして扱うことができます。この動作が「驚くべき」ものになる現実世界のシナリオはほとんどないため、(可能性のある) 正確さよりも使いやすさを優先してください。