请考虑以下代码,其中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
任何有关正确方向的帮助或提示都将受到赞赏。感谢。
答案 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>
类中有更多内容,因为它使用引用相等性,所以不必须重载运算符。)