SequenceEqual不同的结果

时间:2017-03-13 14:36:01

标签: c# iequatable

下面的代码中的

在泛型列表上调用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;    
}

1 个答案:

答案 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)的默认行为,你不会覆盖它。