なぜ「??」を使えないのかsystem.dbnull値のオペランド?
質問
NULL の列をフェッチする Oracle データテーブルがあります。そこで、コードをわかりやすくシンプルに保つために、?? を使用すると思います。オペランド。AlternatePhoneNumber は C# モデルの文字列です。
AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
ただし、そのコードを使用してもまだエラーが発生します。
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
エラーの意味はわかっていますが、なぜですか??DBNullでは使えないのでしょうか?null と DBNull は本質的に同じではないでしょうか?
ありがとう。
解決
の ??
演算子は実際のものにのみ適用されます null
s.
null
そして DBNull.Value
同じではありません。 DBNull.Value
は単なるプレースホルダー オブジェクトです。
また、その例外は内部から発生しています。 AlternatePhoneNumber
財産、あなたの前に ??
オペレーターが実行します。(コードにはキャストがありません)。
もし customer
型付きデータセット内の行である場合は、列の行を変更します NullValue
デザイナーのプロパティ。
他のヒント
nullとdbnullは同じではありません。System.DBNullは実際のオブジェクトです。
問題はAlternatePhoneNumber
が文字列であることです。dbnullはそうではありません。
代わりにこれを試してみてください:
AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""
. これを行う:
public T IfNull<T>(object o, T value)
{
return (o == DbNull.Value) ? value : (T)o;
}
. dbnullは単一の値を持つタイプで、NULL文字列参照と同じではありません。これが??
を使用できない理由です。あなたはこれを行うことができます:
string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
. 他の返信状態として、null
とは、ADO.CETAGCODEがADO.NETからを参照しているクラスで、フィールドまたは値がデータベースでNULL(またはIN)である場合に、を示すクラスです。データベース可能な)
条件(三項)演算子を使用することができる。(?:) あなたが望むものをする:
AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull
? ""
: customer.AlternatePhoneNumber;
.
これを拡張方式:
static class NullExtensions
{
public static T WhenNull<T>( this object value, T whenNullValue )
{
return (value == null || value is DBNull)
? whenNullValue
: (T)value;
}
}
.
私が見つけたものはコードを読みやすく理解しやすくします。
AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );
. dbnullは実際の "null"ではありません。
「?」 - オペレータは、「NULL」動作をエミュレートするオブジェクトではなく、NULL - 参照のみを検出します。