C# 为什么包含的比较对象不同于==? 对象t=4; 对象s=4; 如果(t==s){//false } List q=新List(){t}; 已找到布尔值=q.Contains(s);//发现=真!

C# 为什么包含的比较对象不同于==? 对象t=4; 对象s=4; 如果(t==s){//false } List q=新List(){t}; 已找到布尔值=q.Contains(s);//发现=真!,c#,.net,C#,.net,在上面的代码中,t==s返回false,我并不感到惊讶;它将引用与两个对象进行比较,而引用并不相同 但我感到惊讶的是,包含返回真实;显然,这不仅仅是比较对象引用,就像比较4和4的未绑定值一样,但它如何以及为什么知道要取消绑定对象来比较它们呢?我试图理解这里更重要的原则。根据文档: 通过使用确定序列是否包含指定元素 默认的相等比较器 Contains使用Equals方法,而不是=运算符。Contains使用object.Equals(object),实现int的方法,使4.Equals(4)为真=

在上面的代码中,
t==s
返回
false
,我并不感到惊讶;它将引用与两个对象进行比较,而引用并不相同

但我感到惊讶的是,包含返回真实;显然,这不仅仅是比较对象引用,就像比较4和4的未绑定值一样,但它如何以及为什么知道要取消绑定对象来比较它们呢?我试图理解这里更重要的原则。

根据文档:

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


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

Contains
使用
object.Equals(object)
,实现
int
的方法,使
4.Equals(4)
为真<代码>=每侧都有对象,仅使用参考比较


同样值得注意的是:
object.Equals(t,s)=true
,因为如果引用相等失败,则使用实例的
Equals
方法。

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


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

=
使用变量类型确定要比较的等式

对于
对象
/
对象
它将执行一个引用等式

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

表达式

Object t = 4;
Object s = 4;

if (t == s) {       // false
}

List<Object> q = new List<object>() { t };
Boolean found = q.Contains(s);          // found = true!

正在查找
q
的元素,其
.Equals(元素,s)
为true。对于装箱原语,这将比较值。

我认为
=
默认为
对象
在内存中的位置的参考比较,因为它们是两个不同的对象;他们在记忆中有两个截然不同的地方。因此它们不是
==
。实际上它可能使用
EqualityComparer.Default.Equals
。我得到一个虚拟的Equals方法(“默认比较器”)被调用来进行比较。但是我想象在我的例子中被调用的方法必须是Object。Equals,因为我正在对其执行包含操作的类型是Object。如果是这样的话,Object.Equals如何知道将内容取消装箱并将其作为int进行比较?@DeCaf
EqualityComparer.Default
在引擎盖下使用Object.Equals
。@MichaelRayLovett,因为虚-实变量类型中的
Equals
方法是运行时检查,这就是调用
int.Equalt
方法的原因。我得到了这个方法的一般要点。。要更好地理解这一点,什么样的信息来源是好的?
==
使用变量的类型而不是对象的类型来确定要调用的方法。
q.Contains(s)