Question

Il semble qu'il y ait une certaine confusion de type dans l'opérateur ternaire. Je sais que cela a été abordé dans d'autres fils de SO, mais il a toujours été avec nullables. En outre, pour mon cas, je suis vraiment à la recherche d'une façon meilleure.

Je voudrais pouvoir utiliser

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

mais je suis coincé avec ceci:

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

L'opérateur ternaire échoue parce qu'il n'y a pas de conversion possible entre DBNull et la chaîne, et aussi stupide que cela semble envisage la valeur est l'objet, les coups de pied du compilateur de nouveau pour moi et je suis forcé de soins. La réponse à la version annulable de cette question est de simplement jeter nulle à chaîne et faire avec elle; DBNull ne peut pas être à chaîne jeté, cependant, donc pas de chance là-bas.

Est-il possible de le faire plus concis (sans utiliser nullables, en passant?)

Merci!

Était-ce utile?

La solution

Vous pouvez changer votre première déclaration à:

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

Autres conseils

Le Value la propriété est de type object, de sorte que vous devriez jeter à object, non string:

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

Ou vous pouvez ajouter une méthode d'extension tels que:

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

Et alors vous pouvez dire

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

(Adapté de Phil Haack )

Lisible et concis, non?

Qu'en est-il en utilisant le ?? opérateur null coalescent Plus de détails sur ?? opérateur

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top