У мене є умова програми Silverlight, яка порівнює 2 рядки, чомусь коли я використовую, ==
вона повертає помилку, а .Equals()
повертає істину .
Ось код:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Будь-яка причина, чому це відбувається?
==
, але оператори не є поліморфними. У цьому коді ==
оператор викликається на тип object
, який робить порівняння ідентичності замість значення.
==
перевантаження на основі типу часу компіляції операндів. Content
Властивість object
. Оператори не є віртуальними, тому реалізація за замовчуванням ==
викликається, даючи порівняльне порівняння порівняння. При рівності виклик переходить до віртуального методу object.Equals(object)
; string
переосмислює цей метод і виконує порядкове порівняння за вмістом рядка. Див. Msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspx та referenceources.microsoft.com/#mscorlib/system/string.cs,507 .
==
має тип часу компіляції, object
а правий має тип часу компіляції string
, тоді компілятор C # повинен вибрати (в даному випадку проблематичне) перевантаження operator ==(object, object)
; але він буде видавати попередження у час компіляції , що це може бути непередбачені. Тож читайте попередження про час збирання! Щоб виправити проблему та використовувати її ==
, відведіть ліву частину до string
. Якщо я пам'ятаю правильно, текст попередження говорить саме про це.