14
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;它正在比较对两个对象的引用,并且引用不一样。

但令我惊讶的是,包含返回真实;显然它不仅仅是比较对象引用..它就像比较 4 和 4 的未装箱值..但是它如何以及为什么知道将对象拆箱以比较它们?我试图在这里理解更大的原则。

4

6 回答 6

13

表达方式

q.Contains(s)

正在寻找一个q为真的元素。对于盒装图元,这会比较值。EqualityComparer<object>.Default.Equals(element, s)

于 2013-04-23T18:14:33.193 回答
7

Contains,在内部,是使用实例object.Equals方法来比较元素。它没有使用==运算符。

Equals方法是虚拟的,而== operator是静态的。这意味着==操作员将根据变量的编译时类型(而不是变量所持有的运行时对象)来确定要运行的代码。另一方面,虚拟方法不是静态绑定的。它根据变量值的Equals运行时类型确定要运行的重载。

于 2013-04-23T18:13:40.927 回答
5

根据Contains文档:

使用默认相等比较器确定序列是否包含指定元素。

于 2013-04-23T18:13:02.867 回答
2

Contains使用Equals方法而不是==运算符。

于 2013-04-23T18:13:09.043 回答
0

==使用变量的类型来确定要比较的相等性。

For object/object它会做一个引用相等。

Contains将使用Equals虚拟方法,并且可能会被重载来进行值比较。在这种情况下int是这样写的。

于 2013-04-23T18:14:23.480 回答
-1

Containsuses object.Equals(object),它 for ints 被实现,所以这4.equals(4)是真的。 ==with objects on each side 仅使用参考比较。

另请注意:object.Equals(t, s) == true因为如果引用相等失败,此方法将使用实例的方法。Equals

于 2013-04-23T18:13:32.347 回答