2012-02-25 4 views
-1

Je suis confronté à des erreurs de référence de valeur nulle incohérentes pendant que j'essaie de stocker mes valeurs à partir d'un objet de classe sérialisé.Exceptions de référence de valeur nulle incohérentes

if (item.current_location.city!=null) 
{ 
    var city = item.current_location.city.Select(i => i.ToString()); 
} 

Dans l'extrait de code ci-dessus, l'insertion réussie a lieu même si un index dans le tableau item a des valeurs nulles. Mais il jette une exception dans certains cas, que je ne pense pas pouvoir distinguer d'une quelconque manière des autres cas (lorsque la valeur est nulle)

+1

Qu'est-ce que est le type de données de 'city'? Collection de types personnalisés? –

Répondre

5

item pourrait être nul aussi bien

current_location pourrait être nul aussi bien,

non seulement city.

Cela aiderait

if (item != null && 
    item.current_location != null && 
    item.current_location.city != null) { 
    ... 
} 

EDIT:

Note: Ce code fonctionne, puisque C# met en œuvre un soi-disant raccourci-évaluation des expressions booléennes. Si item doit être null, le reste de l'expression ne sera pas évalué. Si item.current_location doit être null, le dernier terme ne sera pas évalué.


(je ne vois pas d'insertion dans le code ci-dessus.)


A partir de C# 6.0, vous pouvez utiliser l'opérateur de propagation nulle (?):

var city = item?.current_location?.city?.Select(i => i.ToString()); 
if (city != null) { 
    // use city ... 
} 
+0

oui j'ai eu ma faute. Merci –

+0

insérer le code n'a pas eu de problème. Je viens de mentionner ce que j'essaie de faire. –

0

Je ne peux pas donner une réponse définitive sans voir votre jeu de données, mais vous ' ne vérifiez pas les valeurs nulles sur l'objet item ou l'objet current_location. Je vous suggère de commencer en changeant votre test à ceci:

if (null != item && null != item.current_location && null != item.current_location.city) 
{ 
... 
} 
+0

Je ne peux pas faire cela Matt, parce que dans l'emplacement actuel j'ai d'autres valeurs comme l'état et le pays, si un utilisateur n'a pas spécifié d'informations d'identification, alors selon votre code d'autres informations d'identification seront également rejetées. –

+0

Votre code est correct. Cependant, pourquoi commencez-vous les vérifications avec 'null! ='. Il semble que vous étiez en train de tester combien «null» est. 'null' est toujours' null'. Il semble plus intuitif de regarder combien les valeurs sont, car elles peuvent changer, «valeur! = Quelque chose». –

+0

@ OlivierJacot-Descombes: http://www.mathwords.com/s/symmetric_property.htm C'est une préférence personnelle, un peu comme si vous étiez du type à copier la réponse de quelqu'un et ensuite à la critiquer. –

Questions connexes