2010-08-09 12 views
7

Sembra che ci sia del tipo di confusione nell'operatore ternario. So che questo è stato risolto in altri thread SO, ma è sempre stato con nullable. Inoltre, per il mio caso sto solo cercando un modo migliore.Utilizzo conciso di DBNull? (Ternario?)

mi piacerebbe essere in grado di utilizzare

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id; 

ma invece mi sono bloccato con questo:

if (string.IsNullOrEmpty(dest.Id)) 
{ 
    proc.Parameters[PARAM_ID].Value = DBNull.Value; 
} 
else 
{ 
    proc.Parameters[PARAM_ID].Value = dest.Id; 
} 

L'operatore ternario fallisce perché non c'è alcuna conversione possibile tra DBNull e la stringa, e per quanto sciocco possa sembrare che Value sia un oggetto, il compilatore me lo restituisce e io sono costretto a preoccuparmi. La risposta alla versione nullable di questa domanda è quella di eseguire il cast null alla stringa e di eseguirla; DBNull non può essere lanciato su una stringa, quindi non ci sono fortuna.

Esiste un modo più conciso per fare questo (senza l'utilizzo di nullables, a proposito?)

Grazie!

risposta

19

si potrebbe cambiare la vostra prima dichiarazione:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id; 
+4

Oh. Duh. Aa e questo è ciò che lo stackoverflow è per. Grazie! – bwerks

6

La proprietà Value è di tipo object, così si dovrebbe lanciare a object, non string:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id) 
    ? (object)DBNull.Value 
    : (object)dest.Id; 
+0

ho intenzione di dare la risposta a Giacobbe dal momento che a quanto pare ha risposto prima di circa 20 secondi. Grazie anche a te! – bwerks

+0

@bwerks Penso che tu abbia letto i timestamp all'indietro. ;) – Dan

6

o si potrebbe aggiungere un'estensione metodo come:

public static class DBNullExtensions 
{ 
    public static object AsDBNullIfEmpty(this string value) 
    { 
     if (String.IsNullOrEmpty(value)) 
     { 
      return DBNull.Value; 
     } 
     return value; 
    } 
} 

E poi si può solo dire che

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty(); 

(Adattato da Phil Haack)

leggibile e conciso, no?

+0

Scavo l'uso dei metodi di estensione; purtroppo questo progetto è in C# 2.0. Boo sibila. – bwerks

+3

Bummer! Forse puoi scolpire qualcosa dagli obelischi di pietra;) –

3

E a proposito di usare il ?? null-coalescenza operatore More details about ?? operator

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value; 
+0

Operatore '??' non può essere applicato al tipo 'bool' e 'oggetto'. Se si rimuove '(oggetto)', il compilatore si lamenterà del tipo 'DBNull' invece di 'oggetto'. – ivorykoder

+0

@ivorykoder il ?? l'operatore può essere usato solo su tipi nullable, come 'lhs ?? rhs' è essenzialmente equivalente a 'lhs! = null? lhs: rhs'. Questo è il motivo per cui stai ricevendo "non può essere applicato al tipo 'bool'" - 'bool' non è annullabile! – FireSBurnsmuP