gpt4 book ai didi

c# - SequenceEqual 不同的结果

转载 作者:行者123 更新时间:2023-11-30 17:34:17 30 4
gpt4 key购买 nike

在下面的代码中调用 SequenceEqual当 List 是用类泛型类型定义的(调用 EquatableClass.Equals<>)时,在泛型列表上返回 true(如预期的那样)。

如果列表定义为IEquatable接口(interface),未调用 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;
}

最佳答案

SequenceEqual<T>方法将尝试查看它是否可以转换 TIEquatable<T> , 如果可以,它将使用 IEquatable<T>.Equals为了平等。

当你有一个 List<EquatableClass>然后它将尝试转换 EquatableClassIEquatable<EquatableClass> , 并且成功,所以它使用适当的 Equals方法。

当你有一个 List<IEquatable<EquatableClass>>然后它将尝试转换 IEquatable<EquatableClass>IEquatable<IEquatable<EquatableClass>> ,那会失败,因为实际对象没有实现 IEquatable<IEquatable<EquatableClass>> , 所以它求助于使用 object.Equals(object) 的默认行为,您不会覆盖它。

关于c# - SequenceEqual 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42766269/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com