Tengo una condición en una aplicación de Silverlight que compara 2 cadenas, por alguna razón cuando la uso ==
devuelve false mientras .Equals()
devuelve true .
Aquí está el código:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
¿Alguna razón de por qué sucede esto?
==
, pero los operadores no son polimórficos. En este código, el ==
operador se invoca en tipo object
, que hace una comparación de identidad en lugar de un valor.
==
sobrecarga basada en el tipo de tiempo de compilación de los operandos. El Content
inmueble es object
. Los operadores no son virtuales, por lo que ==
se llama a la implementación predeterminada de , que ofrece una comparación de igualdad de referencia. Con Equals, la llamada va al método virtual object.Equals(object)
; string
anula este método y realiza una comparación ordinal en el contenido de la cadena. Consulte msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspx y referencesource.microsoft.com/#mscorlib/system/string.cs,507 .
==
tiene tipo de tiempo de compilación object
y el lado derecho tiene tipo de tiempo de compilación string
, entonces el compilador de C # debe elegir la sobrecarga (problemática, en este caso) operator ==(object, object)
; pero se emita una advertencia de tiempo de compilación que podría ser no intencionados. ¡Entonces lea las advertencias en tiempo de compilación! Para solucionar el problema y seguir usándolo ==
, eche el lado izquierdo a string
. Si no recuerdo mal, el texto de advertencia sugiere exactamente eso.