C# - 具有接口类型列表的相等运算符无法按预期工作

时间:2017-01-05 22:22:52

标签: c# collections operators equals equality

请考虑以下代码,其中WaitForSingleObject()是从ClassOne派生的类:

IClass

除了List<IClass> list = new List<IClass>(); list.Add(new ClassOne("foo", "bar")); list.Add(new ClassOne("baz", "bam")); List<IClass> list2 = new List<IClass>(); list2.Add(new ClassOne("foo", "bar")); list2.Add(new ClassOne("baz", "bam")); if (list == list2) Console.WriteLine("Lists are equal."); else Console.WriteLine("Lists are NOT equal."); operator ==operator !=Equals(ClassOne)Equals(object)之外,等于运算符返回false(即列表不匹配)已为GetHashCode()实施/覆盖。这是为什么?我希望等于运算符返回true。是否还有其他方法/接口必须实现ClassOne运算符才能按预期工作?

供参考,以下是==ClassOne的实施:

IClass

任何有关正确方向的帮助或提示都将受到赞赏。感谢。

2 个答案:

答案 0 :(得分:8)

  

为什么?我希望等于运算符返回true。

不正确 - ==运算符(和Equals())未在List<T>上定义以检查其内容是否相等 - 它默认引用{{}上定义的运算符的相等性1}}。由于这两个列表是不同的对象,object返回false。

您可以使用Linq SequenceEqual方法确定两个列表是否包含相同顺序的相等对象:

==

答案 1 :(得分:3)

因为==类的List<T>运算符没有重载。列表的==只是引用相等。即使两个持有相同List<int>的{​​{1}}个对象也不相等,等等。

如果您询问是否int,编译器会调用list == list2的{​​{1}}运算符,而==类的设计者已决定两个列表仅相等如果两者都引用相同的列表。换句话说:

List<T>

(显然List<T>类中有更多内容,因为它使用引用相等性,所以必须重载运算符。)