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. ContentNieruchomość 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); stringprzesł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, objecta 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.
