【发布时间】:2017-03-13 14:36:01
【问题描述】:
在下面的代码中,当使用类泛型类型定义 List(调用EquatableClass.Equals<>)时,在泛型列表上调用 SequenceEqual 返回 true(如预期的那样)。
如果 list 使用IEquatable 接口定义,则不会调用 Equals 方法并且结果为 false(而是调用 object.Equals,而不是在代码中)。
问题是,为什么第二种情况没有调用EquatableClass.Equals<>方法?
public class EquatableClass : IEquatable<EquatableClass>
{
public string Name { get; set; }
public bool Equals(EquatableClass other) => this.Name.Equals(other.Name);
}
static void Main(string[] args)
{
var A = new List<EquatableClass> { new EquatableClass { Name = "A" } };
var B = new List<EquatableClass> { new EquatableClass { Name = "A" } };
var result1 = A.SequenceEqual(B); // == true;
var AA = new List<IEquatable<EquatableClass>> { new EquatableClass { Name = "A" } };
var BB = new List<IEquatable<EquatableClass>> { new EquatableClass { Name = "A" } };
var result2 = AA.SequenceEqual(BB); // == false;
}
【问题讨论】:
-
因为参数与类参数不匹配。所以使用默认方法。
-
这就是如果你正在实现
IEquatable<T>你应该覆盖Equals(object)的行为以匹配行为的原因。 -
总是覆盖
Equals(+GetHashCode),例如:public override bool Equals(object obj) { EquatableClass other = obj as EquatableClass; return obj != null && other.Equals(this); }
标签: c# iequatable