Silverlightアプリケーションに2つの文字列を比較する条件があります。何らかの理由で、それを使用する==
とfalseが.Equals()
返され、trueが返されます。
これがコードです:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
これがなぜ起こっているのかについて何か理由がありますか?
==
が、演算子はポリモーフィックではありません。このコードでは、==
演算子はtype object
で呼び出され、値1ではなくID比較を行います。
==
は、オペランドのコンパイル時のタイプに基づいてオーバーロードを選択します。Content
プロパティがありますobject
。演算子は仮想ではないため、のデフォルトの実装==
が呼び出され、参照の等価性比較が行われます。Equalsでは、呼び出しは仮想メソッドに送られobject.Equals(object)
ます。string
このメソッドをオーバーライドし、文字列コンテンツに対して序数比較を実行します。msdn.microsoft.com/en-us/library/fkfd9eh8(v=vs.110).aspxおよびreferencesource.microsoft.com/#mscorlib/system/string.cs,507を参照してください。
==
コンパイル時の型がobject
あり、右側にコンパイル時の型string
がある場合、C#コンパイラは(この場合は問題のある)オーバーロードを選択する必要があることに注意してくださいoperator ==(object, object)
。それがされます、それが意図しないすることができることをコンパイル時の警告を発行します。だから、読んで、コンパイル時の警告を!問題を修正して引き続きを使用する==
には、左側をにキャストしstring
ます。私が正しく覚えている場合、警告テキストはそれを示唆しています。