Ho il seguente bit di codice per impostare un parametro che verrà utilizzato in un'istruzione INSERT per impostare una colonna VARCHAR in un database SQL Server. Il mio oggetto valore (denominato ilo) ha una proprietà denominata Descrizione che viene inizializzata in String.Empty e quindi viene impostata su un valore letto da XML oppure, se quell'elemento XML è vuoto, rimane semplicemente String.Empty.L'impostazione del parametro su DBNull.Value utilizzando la sintassi ternaria genera un errore?
Quindi, quando si inserisce nel database, se la proprietà è ancora impostata su String.Empty, mi piacerebbe averlo inserire un valore nullo.
database.AddInParameter(cmd, "@description", DbType.String,
(ilo.Description.Equals(string.Empty)) ?
DBNull.Value :
ilo.Description);
Quindi, in pratica quello che sto dicendo, se è uguale a ilo.Description String.Empty, impostare il parametro su DBNull.Value, altrimenti impostarlo su ilo.Description.
Questo dà il seguente errore in Visual Studio ...
Errore 141 Tipo di espressione condizionale non può essere determinato, perché non v'è alcuna conversione implicita tra 'System.DBNull' e 'stringa'
Perché?
La parte curiosa è che posso fare quanto segue senza errori, che dovrebbe essere esattamente la stessa cosa che usare la sintassi condizionale in linea come sopra!?!
if(ilo.Description.Equals(string.Empty))
{
database.AddInParameter(cmd, "@description", DbType.String, DBNull.Value);
}
else
{
database.AddInParameter(cmd, "@description", DbType.String, ilo.Description);
}
Ho cercato altri posti, e abbiamo trovato l'uno sotto, ma in realtà non rispondere alla mia domanda.
EntLib Way to Bind "Null" Value to Parameter
Sono più interessato al perché, perché la soluzione più ovvia è quella di utilizzare solo un if else/invece della linea di sintassi (ternario)?
C'è una sorta di risposta a questo link, ma mi piacerebbe una spiegazione migliore, perché mi sembra BS che questo non funzioni; Lo definirei un bug!
http://msdn.microsoft.com/en-us/library/ty67wk28.aspx
È possibile ottenere dettagli sull'operatore ternario e questo tipo di problema [in questa risposta] (http://stackoverflow.com/questions/4290203/simple-c-why-assigning-null-in-ternary-operator-fails -no-implicito-conversione) – Steve
Grazie Steve. Il tuo link era quello che stavo cercando davvero. Penso che questo sia un aspetto stupido di .NET però; perché non valutano solo se i tipi di ogni possibile risultato corrispondono alla dichiarazione. Ad esempio, se si dice Object o = (someBool)? someInt32: someString; si ottiene un errore, ma quanto sarebbe facile valutare che entrambi i risultati possano essere espressi in modo implicito su un oggetto, invece di valutare se è possibile eseguire il cast di qualche stringa su alcuniInt32? Mi sembra stupido, ma immagino sia così. Grazie! – Jim
Vorrei anche commentare che sono molto impressionato dalla velocità e precisione delle risposte a questo thread. Questa comunità è fantastica! Grazie a tutti! – Jim