Convert.ToString(null)
戻り値
null
私の期待通りに。
だが
Convert.ToString(null as object)
戻り値
""
これらはなぜ違うのですか?
Convert.ToString(null)
戻り値
null
私の期待通りに。
だが
Convert.ToString(null as object)
戻り値
""
これらはなぜ違うのですか?
回答:
ToStringここに登場するオーバーロードが2つあります
Convert.ToString(object o);
Convert.ToString(string s);
C#コンパイラは基本的に、入力を処理する最も具体的なオーバーロードを選択しようとします。null値は、任意の参照型に変換可能です。この場合stringはより具体的であるobjectため、勝者として選択されます。
では、null as object式のタイプをとして固めましたobject。つまり、stringオーバーロードとの互換性がなくなり、コンパイラがobjectのみが残っているオーバーロードをます。
この引き分けの仕組みの非常に複雑な詳細は、C#言語仕様のセクション7.4.3で説明されています。
Convert.ToString(string)それの実装を見ると、Convert.ToString(object)実際には追跡するのが難しいパスを通過するときのアイデンティティ関数です。一見して同じように返す必要があることに同意しますが、BCLのコンバーチブルレイヤーは私がよく知っているものではなく、その違いには十分な理由がある可能性があります(私は懐疑的です)
(string)null、またはオブジェクトがoと呼ばれる場合(string)o
続きJaredParの優れたオーバーロードの解決の答え-質問は「なぜままConvert.ToString(string)リターンヌルが、Convert.ToString(object)リターンはstring.Empty」?
Convert.ToString(string)は、「指定された文字列インスタンスです。実際の変換は実行されません。」
Convert.ToString(object)は、「値の文字列表現、または値がnullの場合はString.Empty」を返します。
編集:これが「仕様のバグ」、「非常に悪いAPI設計」、「なぜこのように指定されたのか」などかどうかについて-表示されない理由について、いくつかの根拠で説明しますそれは大したことです。
System.Convertすべての基本型をそれ自体に変換するメソッドがあります。これは奇妙です-変換が必要ない、または可能でないため、メソッドは最終的にパラメーターを返すだけです。Convert.ToString(string)同じように動作します。私はこれらがコード生成シナリオのためにここにあると思います。Convert.ToString(object)渡されnullたときに3つの選択肢があります。スロー、nullを返す、またはstring.Emptyを返します。スローは悪いことです-生成されたコードにこれらが使用されると仮定すると、二重にそうなります。nullを返すには、呼び出し元がnullチェックを行う必要があります。これも、生成されたコードではあまり適していません。string.Emptyを返すのは妥当な選択のようです。残りのSystem.Convertは、デフォルト値を持つ値タイプ扱います。Convert.ToString(string)は、「実際の変換なし」のルールを破ることを意味します。以来、System.Convert静的ユーティリティクラスであり、各メソッドは、論理的にそれ自身として扱うことができます。この振る舞いが「意外」であるはずの現実世界のシナリオはほとんどないので、ユーザビリティを(可能性のある)正確さに勝ち取ってみましょう。