我最近遇到了一个列表中元组的惊人行为。似乎列表中的包含与我期望的不同。请有人解释一下这个区别吗?
Tuple<int,int> A = new Tuple<int, int>(5,5);
Tuple<int, int> B = new Tuple<int, int>(5, 5);
List<Tuple<int,int>> AList = new List<Tuple<int, int>>() {A};
bool C = AList.Contains(B); // returns true
bool D = A == B; // returns false
编辑1:解决重复标记。我知道==和.Equals是不同的函数,这里令人惊讶的是List.Contains函数中的特定实现。
答案 0 :(得分:2)
元组是作为参考类型实现的,更多信息请read here。
基线是参考类型==
执行身份比较,因此只有当两个引用都指向同一个对象时,结果才为真。
Equals
方法执行值比较,如果引用指向等效的对象,它将返回true。
答案 1 :(得分:2)
A == B比较引用,因为它们指向两个不同的对象,结果为false。我认为这对你来说已经很熟悉了。
bool C = AList.Contains(B);将调用.Equal来检查相等性,从而返回true。
差异与A == B vs A.Equals(B)
相同答案 2 :(得分:1)
Contains
使用从Equals
object
方法
==
测试实例的相等性(即它们是否引用了相同的实例)。
因此,我们可以总结Tuple
必须覆盖Equals
并在每个元素匹配时返回true,而==
必须检查左侧和右侧的实例是否为同样的。
答案 3 :(得分:1)