Ich habe eine Bedingung in einer Silverlight - Anwendung , die zwei Strings vergleicht, aus irgendeinem Grund , wenn ich ==es wieder falsch während .Equals()kehrt wahr .
Hier ist der Code:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Gibt es einen Grund, warum dies geschieht?
==, aber Operatoren sind nicht polymorph. In diesem Code wird der ==Operator für den Typ aufgerufen object, der einen Identitätsvergleich anstelle eines Werts eins durchführt.
==Überladung basierend auf dem Typ der Operanden zur Kompilierungszeit. Das ContentAnwesen ist object. Operatoren sind nicht virtuell, daher wird die Standardimplementierung von ==aufgerufen, um einen Vergleich der Referenzgleichheit zu ermöglichen. Bei Equals geht der Aufruf an die virtuelle Methode object.Equals(object). stringüberschreibt diese Methode und führt einen ordinalen Vergleich des Zeichenfolgeninhalts durch. Siehe msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspx und referencesource.microsoft.com/#mscorlib/system/string.cs,507 .
==Typ objectzur Kompilierungszeit und die rechte Seite den Typ zur Kompilierungszeit hat . Es wird jedoch eine Warnung zur Kompilierungszeit ausgegeben, dass dies unbeabsichtigt sein könnte. So lesen Sie die Kompilierung-Warnungen! Um das Problem zu beheben und weiterhin zu verwenden , werfen Sie die linke Seite auf . Wenn ich mich richtig erinnere, schlägt der Warnungstext genau das vor. stringoperator ==(object, object)==string
