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

如何为C# record struct自定义Equals(object?)方法替代自动实现?

能否为C#的record struct自定义Equals(object?)方法替代自动生成版本?

问题核心

需要为C#的record struct自定义从Object继承的Equals(object?)方法,替换编译器自动生成的版本。注意这和重写强类型的MyRecord.Equals(MyRecord)不是一回事——后者很容易实现,但前者在record struct中尝试重写时,IDE会提示「已声明具有相同签名的成员」,编译器直接抛出错误CS0111:「类型‘Color’已定义一个具有相同参数类型的名为‘Equals’的成员」。这是record的设计特性,但不想放弃record带来的便利,询问可行的解决办法。

可行方案分析

目前没有直接的方式可以重写record struct的Equals(object?)方法——编译器会自动为record struct生成该方法的override版本,这是语言层面的设计限制,无法通过常规编译手段绕过。不过可以通过以下间接方式实现类似需求:

  • 利用强类型Equals方法间接影响结果:
    编译器生成的Equals(object?)逻辑是:先检查传入对象是否为当前record struct类型的实例,如果是则调用强类型的Equals(MyRecord)方法,否则返回false。所以自定义强类型的Equals(MyRecord)方法,会间接改变Equals(object?)在参数为同类型时的判断逻辑。这是官方提供的扩展方式,也是最安全可靠的途径。

  • 极端场景下的运行时hack(不推荐):
    如果需求完全不依赖强类型Equals的逻辑,甚至需要处理非同类型参数的自定义判断,只能通过反射在运行时替换Equals(object?)的方法实现。但这种方式破坏了record的设计语义,还会带来性能和稳定性问题,除非万不得已不建议使用。

结论

如果核心需求是调整同类型实例的相等判断逻辑,优先选择重写强类型的Equals(MyRecord)方法,既能保留record的所有特性,又能间接实现对Equals(object?)的控制。如果必须处理非同类型参数的自定义相等判断,目前没有符合语言规范的解决方案,只能考虑放弃record struct,或者接受使用不推荐的运行时hack。

内容的提问来源于stack exchange,提问作者Mike Nakis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:52:51