Object t = 4;
Object s = 4;
if (t == s) { // false
}
List<Object> q = new List<object>() { t };
Boolean found = q.Contains(s); // found = true!
在上面的代码中,t == s
返回false
并不感到惊讶;它将对两个对象的引用进行比较,并且引用不相同。
但我很惊讶Contains回归真实;显然它不仅仅是比较对象引用。就像它比较4和4的未装箱值..但是如何以及为什么要解除对象的比例以便对它们进行比较?我正试图了解这里更大的价值。
答案 0 :(得分:13)
表达式
q.Contains(s)
正在寻找q
.Equals(element, s)
为真的{{1}}元素。对于盒装基元,这会比较值。
答案 1 :(得分:7)
Contains
正在使用实例object.Equals
方法来比较元素。它没有使用==
运算符。
Equals
方法是虚拟的,而== operator
是静态的。这意味着==
运算符将根据变量的编译时类型确定要运行的代码(而不是变量保存的运行时的对象)。另一方面,虚拟方法不是静态绑定的。它根据值的变量的运行时类型确定要运行Equals
的重载。
答案 2 :(得分:5)
根据Contains
文档:
使用确定序列是否包含指定元素 默认的相等比较器。
答案 3 :(得分:2)
Contains
使用Equals
方法代替==
运算符。
答案 4 :(得分:0)
==
使用变量的类型来确定要比较的等式。
对于object
/ object
,它将执行引用相等。
Contains
将使用虚拟的Equals
方法,并且可能会重载以进行值比较。在这种情况下,int
就是这样写的。
答案 5 :(得分:-1)
Contains
使用object.Equals(object)
,int
已实现,4.equals(4)
为真。 ==
每边都有对象,仅使用参考比较。
另请注意:object.Equals(t, s) == true
因为如果引用相等失败,this method会使用实例的Equals
方法。