我在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。
==
根据操作数的编译时类型选择重载。该Content
属性是object
。运算符不是虚拟的,因此==
调用的默认实现,以进行引用相等性比较。使用Equals,该调用转到虚拟方法object.Equals(object)
;string
重写此方法,并对字符串内容执行序数比较。请参阅msdn.microsoft.com/zh-cn/library/fkfd9eh8(v=vs.110).aspx和referencesource.microsoft.com/#mscorlib/system/string.cs,507。
==
具有编译时类型object
,而右侧具有编译时类型时string
,则C#编译器必须选择(在这种情况下是有问题的)重载operator ==(object, object)
;但它会发出一个编译时警告称,可能会出现意想不到的。因此,请阅读编译时警告!要解决此问题并仍然使用==
,请将左侧投射到string
。如果我没记错的话,警告文字就表明了这一点。