在泛型列表上调用SequenceEqual
时返回true(如预期的那样)当使用类泛型类型定义List时(EquatableClass.Equals<>
被调用)。
如果使用IEquatable
接口定义了list,则不调用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;
}
答案 0 :(得分:1)
SequenceEqual<T>
方法会尝试查看它是否可以将T
转换为IEquatable<T>
,如果可以,则会使用IEquatable<T>.Equals
进行相等。
如果您有List<EquatableClass>
,则会尝试将EquatableClass
转换为IEquatable<EquatableClass>
,并且成功,因此它会使用相应的Equals
方法。
如果您有List<IEquatable<EquatableClass>>
,则会尝试将IEquatable<EquatableClass>
转换为IEquatable<IEquatable<EquatableClass>>
,但这会失败,因为实际对象无法实现IEquatable<IEquatable<EquatableClass>>
,所以它采用object.Equals(object)
的默认行为,你不会覆盖它。