У меня есть условие в приложении 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. Если я правильно помню, текст предупреждения предлагает именно это.
