为什么包含比不同于==的对象?

时间:2013-04-23 18:10:47

标签: c# .net

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的未装箱值..但是如何以及为什么要解除对象的比例以便对它们进行比较?我正试图了解这里更大的价值。

6 个答案:

答案 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方法。