Eu tenho uma condição em um aplicativo silverlight que compara duas strings, por algum motivo, quando eu o uso ==
, retorna false enquanto .Equals()
retorna true .
Aqui está o código:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Alguma razão para isso estar acontecendo?
==
, mas os operadores não são polimórficos. Nesse código, o ==
operador é chamado no tipo object
, que faz uma comparação de identidade em vez de um valor um.
==
sobrecarga com base no tipo de tempo de compilação dos operandos. A Content
propriedade é object
. Os operadores não são virtuais, portanto, a implementação padrão de ==
é chamada, fornecendo uma comparação de igualdade de referência. Com Igual, a chamada vai para o método virtual object.Equals(object)
; string
substitui esse método e executa uma comparação ordinal no conteúdo da string. Consulte msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspx e referenceource.microsoft.com/#mscorlib/system/string.cs.507 .
==
tem tempo de compilação object
e o lado direito string
, o tipo do tempo de compilação , o compilador C # deve selecionar a sobrecarga (problemática, neste caso) operator ==(object, object)
; mas vai emitir um aviso de tempo de compilação que poderia ser não intencional. Então leia os avisos em tempo de compilação! Para corrigir o problema e ainda usar ==
, gire o lado esquerdo para string
. Se bem me lembro, o texto de aviso sugere exatamente isso.