使用 Equals(object) 方法将 C# 记录与其他类型进行比较

Comparing C# records with other types using Equals(object) method

提问人:Khodaie 提问时间:12/6/2022 最后编辑:M. JustinKhodaie 更新时间:11/7/2023 访问量:96

问:

在 C# 中,类型的虚拟方法由编译器自动生成。生成的方法如下所示:object.Equals(object?)record

    [IsReadOnly]
    [CompilerGenerated]
    public override bool Equals(object obj)
    {
        if (obj is MyRecord)
        {
            return Equals((MyRecord)obj);
        }
        return false;
    }

但是,如果记录实现了其他接口呢:IEquatalbe<T>

public readonly record struct MyRecord : IEquatable<int>
{
    // ....

    public bool Equals(int other)
    {
         return Whatever();
    }
}

在这种情况下,方法不考虑这些值,并且使用 不能正常工作(如 FluentAssertions):intEquals(object?)Equals(object?)

   myRecord.Should().Be(4); // will never pass

是否有任何解决方案可以自定义类型的方法?Equals(object?)record

我试图重写记录中的方法,但编译器生成了一个错误:Equals(object)

  Error CS0111: Type 'MyRecord' already defines a member called 'Equals' with the same parameter types
C# 记录 相等性

评论

3赞 MakePeaceGreatAgain 12/6/2022
为什么你的记录是 impklement 而不是?这意味着一些隐式的类型转换,这不是平等的意义所在。IEquatable<int>IEquatbale<MyRecord>
5赞 Jon Skeet 12/6/2022
从根本上说,一个类型为自身以外的类型实现真的很奇怪。撇开别的不说,你为什么要给出不同的结果?这是难以诊断的破损 IMO 的秘诀。IEquatable<T>x.Equals(y)y.Equals(x)

答: 暂无答案