Mam warunek w aplikacji silverlight, która porównuje 2 łańcuchy, z jakiegoś powodu, gdy ==
go używam , zwraca false, a .Equals()
zwraca true .
Oto kod:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Masz powód, dlaczego tak się dzieje?
==
, ale operatory nie są polimorficzne. W tym kodzie ==
operator jest wywoływany według typu object
, który dokonuje porównania tożsamości zamiast wartości.
==
przeciążenie na podstawie typu argumentów czasu kompilacji. Content
Nieruchomość object
. Operatory nie są wirtualne, więc ==
wywoływana jest domyślna implementacja , dająca porównanie równości odniesienia. W przypadku Equals wywołanie przechodzi do metody wirtualnej object.Equals(object)
; string
przesłania tę metodę i wykonuje porządkowe porównanie zawartości ciągu. Zobacz msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspx i referenceource.microsoft.com/#mscorlib/system/string.cs,507 .
==
ma typ czasu kompilacji, object
a prawa strona ma typ czasu kompilacji string
, wówczas kompilator C # musi wybrać (problematyczne, w tym przypadku) przeciążenie operator ==(object, object)
; ale to będzie wydawać ostrzeżenia w czasie kompilacji, że może to być niezamierzona. Przeczytaj więc ostrzeżenia dotyczące czasu kompilacji! Aby rozwiązać problem i nadal używać ==
, przesuń lewą stronę na string
. Jeśli dobrze pamiętam, tekst ostrzegawczy sugeruje właśnie to.