私は困惑しています。最初の行と4行目がnullに評価されないのはなぜですか?Convert.ToString()内の条件式が間違って評価されていますか?
ポスト答え編集:
他人の利益のために、望ましい行動を使用して作成されます:
boolFoo ? null : Convert.ToString(DBNull.Value)
Convert.ToString()
とnull
が暗示ので、これは動作します一般的なタイプのです。
私は困惑しています。最初の行と4行目がnullに評価されないのはなぜですか?Convert.ToString()内の条件式が間違って評価されていますか?
ポスト答え編集:
他人の利益のために、望ましい行動を使用して作成されます:
boolFoo ? null : Convert.ToString(DBNull.Value)
Convert.ToString()
とnull
が暗示ので、これは動作します一般的なタイプのです。
:
first_expression
とsecond_expression
の種類は同じである必要があり、または暗黙的な変換は、他の1つのタイプから存在する必要があります。この場合
null
が暗黙的にSystem.Object
に変換されているように、それが見えます。 MSDNのドキュメントをさらに詳しく調べると、Convert.ToString(Object value)
は、value
がnull
の場合、String.Empty
を返します。 Convert.ToString(null)
がない暗黙的に(あなたが?:
演算子を使用していないので)System.Object
にnull
の変換を行うよう
これは、あなたのポストで6行目と同じではありません。
null
と評価されているようですが、Convert.ToString(object)
はnull
の値をString.Empty
と返します。 Convert.ToString(string)
の場合はOPのコメント
あたり
編集、文字列を単純にしてもnull
場合、返されます。 Reflectorの礼儀:
public static string ToString(string value)
{
return value;
}
6行目でConvert.ToString(null)をnullとして評価し、String.Emptyではないと評価しました。 – bblack
@fearpi - 良い点。私は投稿を更新しました。 –
Convert.ToString((DBNull)null)
それがnullを渡された場合returns an empty stringConvert.ToString(object)
オーバーロードを呼び出します。これは、最初の行と4行目が空の文字列になる理由です。
Convert.ToString(null)
は、Convert.ToString(string)
が最も派生した適用可能なバージョンであるため、オーバーロードを呼び出します。そのオーバーロードreturns the argument unchanged。これが、6行目がnullと評価される理由です。
6行目でConvert.ToString(null)をnullとして評価し、String.Emptyではないと評価していません。 [これを無視する。 ]あなたがあなたのコメントを変更する前に書かれました。] – bblack