You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何仅重写Record的Equals方法或==运算符?

C# Record重写Equals后==同步变化的解决方案

首先明确问题根源:C#的record类型默认会基于所有成员的值相等自动生成==/!=运算符,以及强类型的Equals(Point other)等方法。当你重写了自定义的Equals(Point other)后,自动生成的==运算符内部会直接调用这个重写后的方法,所以两者的相等逻辑会同步。

如果想只重写其中一个(比如保留自定义的Equals,但让==沿用record默认的全字段比较),可以通过显式实现==和!=运算符来拆分两者的逻辑:

示例代码

Point point1 = new Point(1, 2, 3);
Point point2 = new Point(1, 2, 31);

Console.WriteLine(point1 == point2);  // 输出False(默认全字段比较,Z值不同)
Console.WriteLine(point1.Equals(point2));  // 输出True(自定义逻辑,只比较X、Y)

record Point(double X, double Y, double Z)
{
    // 自定义Equals逻辑:仅比较X和Y
    public virtual bool Equals(Point other)
    {
        return other != null && X == other.X && Y == other.Y;
    }

    // 显式实现==运算符,沿用record默认的全字段比较逻辑
    public static bool operator ==(Point? left, Point? right)
    {
        // 使用RecordEqualityComparer调用默认的相等逻辑
        return RecordEqualityComparer<Point>.Default.Equals(left, right);
        // 也可以手动写全字段比较:
        // return left?.X == right?.X && left?.Y == right?.Y && left?.Z == right?.Z;
    }

    // 必须配套实现!=运算符
    public static bool operator !=(Point? left, Point? right)
    {
        return !(left == right);
    }

    // 重要:重写Equals后必须同步重写GetHashCode,保证哈希一致性
    public override int GetHashCode()
    {
        return HashCode.Combine(X, Y);
    }
}

反向需求(重写==但保留默认Equals)

如果你的需求是反过来——自定义==逻辑,但让Equals沿用默认的全字段比较,那么不要重写Equals(Point other),直接显式实现==/!=即可:

record Point(double X, double Y, double Z)
{
    // 自定义==逻辑:仅比较X和Y
    public static bool operator ==(Point? left, Point? right)
    {
        return left != null && right != null && left.X == right.X && left.Y == right.Y;
    }

    public static bool operator !=(Point? left, Point? right)
    {
        return !(left == right);
    }

    // 不重写Equals(Point other),保留默认的全字段比较逻辑
}

注意事项

  • 重写Equals时必须同步重写GetHashCode,否则在HashSet、Dictionary等哈希集合中会出现逻辑错误。
  • record的默认相等逻辑是值相等,和类的引用相等不同,这一点需要牢记。

内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:17:41