2012-06-22 5 views
0
foreach (Control c in panPrev.Controls) 
{ 
if (c.Tag == "move") 

fonctionne bien, mais génère un avertissement: Comparaison possible de références non intentionnelles; pour obtenir une comparaison de la valeur, jeter le côté gauche pour taper « string »Comparaison Avertissement vs NullreferenceException

foreach (Control c in panPrev.Controls) 
{ 
if (c.Tag.ToString() == "move") // this produce NullReferenceException. 

Que faire?

+4

Une autre option serait ré-écrire l'appel comme ' « déplacer » Equals (c.Tag)' – dlev

Répondre

5

Vous n'avez pas accepté la suggestion de l'avertissement. Ce qui serait:

if ((string)c.Tag == "move") 

Cela fonctionne bien dans le cas où Tag est nul, alors qu'essayer d'invoquer .ToString sur une possible référence null vous ouvre à l'exception que vous avez obtenu.

La raison pour laquelle vous devez faire du tout est parce que .Tag est déclarée comme object, et ainsi en utilisant l'opérateur == entre un object et un string utilise l'égalité de référence, alors que la comparaison d'un string à un string utilise la surcharge de == défini dans string qui est implémenté pour comparer les valeurs réelles.

1

Tag est du type object, c'est pourquoi vous obtenez l'avertissement. Si vous savez qu'il s'agit d'une chaîne et que est toujours être une chaîne alors vous devriez la lancer (style C) car vous pourrez attraper les erreurs rapidement si Tag n'est pas une chaîne (mais devrait l'être).

+0

Que faites-vous signifie qu'il n'y a rien à craindre si c'est une ficelle sous le capot? La comparaison '==' échouera sans la distribution si les chaînes sont des instances différentes. –

+0

@KirkWoll: Vous avez raison parce que 'Tag' est du type' object', je ne l'ai pas considéré et j'ai écrit trop vite. Mon erreur, merci. –

1

c.Tag est un objet, donc objet == chaîne fait une comparaison de référence.

L'objet peut être nul, bien sûr, donc l'appel Tag.ToString() peut lancer une exception de référence nulle dans ce cas.

Vous devriez faire comme l'avertissement suggère, et jeté à Tag chaîne:

if ((string)c.Tag == "move") 
Questions connexes