J'ai une condition dans une application Silverlight qui compare 2 chaînes, pour une raison quelconque, lorsque je l'utilise, ==
elle renvoie false tandis que .Equals()
renvoie true .
Voici le code:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Une raison pour laquelle cela se produit?
==
, mais les opérateurs ne sont pas polymorphes. Dans ce code, l' ==
opérateur est appelé sur type object
, qui effectue une comparaison d'identité au lieu d'une valeur.
==
surcharge en fonction du type de compilation des opérandes. La Content
propriété est object
. Les opérateurs ne sont pas virtuels, donc l'implémentation par défaut de ==
est appelée, donnant une comparaison d'égalité de référence. Avec Equals, l'appel passe à la méthode virtuelle object.Equals(object)
; string
remplace cette méthode et effectue une comparaison ordinale du contenu de la chaîne. Voir msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspx et referencesource.microsoft.com/#mscorlib/system/string.cs,507 .
==
a le type au moment de la compilation object
et le côté droit a le type au string
moment de la compilation, alors le compilateur C # doit choisir la surcharge (problématique, dans ce cas) operator ==(object, object)
; mais il sera un avertissement à la compilation qu'il pourrait être involontaire. Lisez donc les avertissements à la compilation! Pour résoudre le problème et continuer à l'utiliser ==
, placez le côté gauche sur string
. Si je me souviens bien, le texte d'avertissement le suggère.