Perché non posso usare '??'Operand per System.DBNull Value?
Domanda
Ho una tabella dei dati Oracle che recupera colonne che siano nulle.Quindi immagino di mantenere il codice bello e semplice che userei il ??operando.AlternatorefoneNumber è una stringa nel mio modello C #.
AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
.
Tuttavia, anche con quel codice ho ancora l'errore.
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
.
So cosa significa l'errore ma perché è ??Non utilizzabile su Dbnull?Non è nullo e dbnull essenzialmente lo stesso?
Grazie.
Soluzione
L'operatore ??
si applica solo a generatori effettivi null
s.
null
e DBNull.Value
non sono uguali;DBNull.Value
è semplicemente un oggetto segnaposto.
Inoltre, tale eccezione proviene dall'interno della proprietà AlternatePhoneNumber
, prima dell'esecuzione del funzionamento ??
.(Il tuo codice non ha un cast).
Se customer
è una riga in un set di dati digitato, modificare la proprietà NullValue
della colonna nel progettista.
Altri suggerimenti
Null e Dbnull non sono uguali.System.dbnull è un oggetto reale.
Il problema è che AlternatePhoneNumber
è una stringa.Dbnull non è.
prova questo invece:
AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""
. Fai questo:
public T IfNull<T>(object o, T value)
{
return (o == DbNull.Value) ? value : (T)o;
}
. Dbnull è un tipo con un singolo valore, e non è la stessa di un riferimento di stringa null, motivo per cui non è possibile utilizzare ??
.Potresti farlo comunque:
string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
. Come altri stati di risposte, null
significa un riferimento che si riferisce a nessun oggetto, mentre DBNull
è una classe fornita da ADO.NET a indicare quando un campo o un valore è null nel database (o inun datatariabile).
Mentre è possibile utilizzare operatore condizionale (Ternario)(? :) per fare ciò che vuoi:
AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull
? ""
: customer.AlternatePhoneNumber;
.
Tendo a avvolgerlo in un Metodo di estensione :
static class NullExtensions
{
public static T WhenNull<T>( this object value, T whenNullValue )
{
return (value == null || value is DBNull)
? whenNullValue
: (T)value;
}
}
.
che trovo rende il codice più facile da leggere e capire.
AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );
. Dbnull non è un vero "NULL".
the "??"- L'operatore rileva solo null - riferimenti, non oggetti che emulano il comportamento "null".