Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写C#equals运算符是否也适用于测试列表相等性?_C#_Equality - Fatal编程技术网

重写C#equals运算符是否也适用于测试列表相等性?

重写C#equals运算符是否也适用于测试列表相等性?,c#,equality,C#,Equality,我有一个像这样重写C#s==运算符的类 public class Foo { /*Variables and Constructors*/ public static bool operator ==(Foo a, Foo b) { /*Check values for equality*/ } } 这是否意味着如果我运行这个表达式 List<Foo> listA == List<Foo> listB List l

我有一个像这样重写C#s==运算符的类

public class Foo
{
    /*Variables and Constructors*/

    public static bool operator ==(Foo a, Foo b) 
    {
         /*Check values for equality*/
    }
}
这是否意味着如果我运行这个表达式

List<Foo> listA == List<Foo> listB
List listA==List listB
它会变成真的吗?如果不是,我应该如何测试这些列表的相等性?

否-
列表
不会覆盖
相等性
,因此默认情况下它使用引用相等性

一个可能的原因是对集合有不同的“相等”定义。秩序重要吗?复制品呢

Linq提供了一种易于使用的方法,文档提供了它使用的标准:

[返回]
true
如果两个源序列长度相等,并且根据其类型的默认相等比较器,它们对应的元素相等;否则,
false

使用

listA.SequenceEqual(listB);

它将调用该类型的默认相等比较器。我很确定这意味着你必须为你的类提供一个equals()方法实现(而不是重载==操作符)。

你考虑过试试吗?@JoshLeBlanc为什么要在谷歌上试试你能做的?谷歌搜索了这个问题,但找不到一个好的简洁的答案,所以现在将有oneNote,你不能覆盖操作符-你只能重载它们。至于“如果我运行这个表达式”-这是一个无效的表达式开始,所以你只会得到一个编译时错误…明白了,那么测试列表是否相等的最佳方法是什么?所以SequenceEqual将为列表中的每个项调用重载==运算符?@NickG这取决于我提到的条件-顺序重要吗?复制品呢?管柱套管?没有一种方法在所有情况下都有效。@不,如果实现该接口,它将使用
IEquatable.Equals
,否则它将使用
Object.Equals
的重写。在任何一种情况下,它都将首先使用
GetHashCode
来查看这两个对象是否相等。@NickG仅供参考,建议您不要在可变类型中重载
==
。您应该只覆盖
Equals
(并且可以选择实现
IEquatable
,以进行类型安全的相等性检查)