2010-08-09 17 views
7

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 threads SO, mais il a toujours été avec des valeurs nulles. En outre, pour mon cas, je suis vraiment à la recherche d'un meilleur moyen.Utilisation concise de DBNull? (Ternaire?)

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 chaîne, et aussi bête que cela puisse paraître étant donné que Value is object, le compilateur me le renvoie et je suis forcé de m'en soucier. La réponse à la version nullable de cette question est juste de lancer null à la chaîne et être fait avec elle; DBNull ne peut pas être transformé en ficelle, donc pas de chance là-bas.

Y at-il une façon plus concise de le faire (sans utiliser nullables, en passant?)

Merci!

Répondre

19

Vous pouvez changer votre première déclaration:

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

Oh. Duh. Aaand c'est ce que stackoverflow est pour. Merci! – bwerks

6

La Value propriété est de type object, donc vous devriez jeter à object, non string:

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

Je vais donner la réponse à Jacob depuis qu'il a répondu apparemment d'abord en 20 secondes environ. Merci à vous aussi de marquer! – bwerks

+0

@bwerks Je pense que vous avez lu les horodatages à l'envers. ;) – Dan

6

Ou vous pouvez ajouter une extension méthode telle 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?

+0

Je creuse l'utilisation des méthodes d'extension; Malheureusement, ce projet est sur C# 2.0 cependant. Boo sifflement. – bwerks

+3

Bummer! Peut-être que vous pouvez ciseler quelque chose à partir d'obélisques de pierre;) –

3

Qu'en est-il de l'utilisation du ?? opérateur coalescent null More details about ?? operator

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

Opérateur '??' ne peut pas être appliqué au type 'bool' et 'object'. Si vous supprimez '(objet)', le compilateur se plaindra du type 'DBNull' au lieu de 'object'. – ivorykoder

+0

@ivorykoder le ?? L'opérateur ne peut être utilisé que sur des types nullables, comme 'lhs ?? rhs est essentiellement équivalent à 'lhs! = null? lhs: rhs'. C'est pourquoi vous obtenez "ne peut pas être appliqué au type" bool "" - "bool" n'est pas nul! – FireSBurnsmuP