Domanda

Sembra che ci sia un certo tipo di confusione nella operatore ternario. So che questo è stato affrontato in altri thread così, ma è sempre stato con nullables. Inoltre, per il mio caso sono davvero solo in cerca di un modo migliore.

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 tanto sciocco quanto che sembra considerando valore è oggetto, i calci del compilatore di nuovo a me e io sono costretto a cure. La risposta alla versione nullable di questa domanda è di lanciare proprio nulla a corda e da fare con esso; DBNull non può essere gettato a stringa, però, così senza fortuna lì.

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

Grazie!

È stato utile?

Soluzione

Si potrebbe cambiare la vostra prima dichiarazione a:

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

Altri suggerimenti

Il Value proprietà è 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;

In alternativa si potrebbe aggiungere un metodo di estensione come ad esempio:

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?

Cosa succede ad usare il ?? operatore null coalescenza Maggiori informazioni su ?? operatore

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top