我在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。如果我没记错的话,警告文字就表明了这一点。
