У меня есть условие в приложении silverlight, которое сравнивает 2 строки, по какой-то причине, когда я использую ==
его, возвращает false, а .Equals()
возвращает true .
Вот код:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Есть причина, почему это происходит?
==
, но операторы не являются полиморфными. В этом коде ==
оператор вызывается для типа object
, который выполняет сравнение идентификаторов вместо значения один.
==
перегрузку на основе типа операндов во время компиляции. Content
Свойство object
. Операторы не являются виртуальными, поэтому ==
вызывается реализация по умолчанию для сравнения ссылок. С Equals вызов переходит к виртуальному методу object.Equals(object)
; string
переопределяет этот метод и выполняет порядковое сравнение содержимого строки. См. Msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspx и referenceource.microsoft.com/#mscorlib/system/string.cs,507 .
==
имеет тип времени компиляции, object
а правая часть имеет тип времени компиляции string
, то компилятор C # должен выбрать (в данном случае проблематично) перегрузку operator ==(object, object)
; но он будет выдавать предупреждение во время компиляции , что это может быть НЕПРЕДВИДЕННЫМ. Так что читайте предупреждения во время компиляции! Чтобы исправить проблему и по-прежнему использовать ==
, приведите левую сторону к string
. Если я правильно помню, текст предупреждения предлагает именно это.