替换 C# 记录结构的合成 Equals()

Replacing the synthesized Equals() of C# record struct

提问人:Mike Nakis 提问时间:3/11/2023 最后编辑:Mike Nakis 更新时间:3/11/2023 访问量:140

问:

总之:

有没有办法提供我自己的方法,而不是被编译器自动生成的方法所困扰?Equals( object? )record struct

注意:

这个问题与替换自动生成的方法无关,这是微不足道的;这个问题是关于替换继承自 的方法,这是一个完全不同的故事。MyRecord.Equals( MyRecord )MyRecord.Equals( Object? )Object

背景:

如果我想覆盖普通的旧 和 ,我可以自由地这样做;但是,我不能用;IDE 显示“已声明具有相同签名的成员”,而编译器给出“错误 CS0111:类型'Color'已定义具有相同参数类型的名为'Equals'的成员”。Equals( object? )classstructrecord

快速浏览一下 Microsoft 官方文档 这里这里 说这是设计使然。

问题:

有谁知道任何解决方法?

(除了从不使用和丧失其所有便利性。record

C# 结构 记录 相等

评论

0赞 Guru Stron 3/11/2023
“为了在一定程度上缓解这个问题,在我需要覆盖对象的每个类中。等于( 对象? )我确保使用 [System.Obsolete] 声明它,这样它就不会被意外调用。- 就我个人而言,我会尝试编写一个分析器来实现这一目标。
0赞 Guru Stron 3/11/2023
另外,您能否展示带有过时属性的技巧 - 因为我无法使它在我的初始尝试中工作
0赞 Mike Nakis 3/11/2023
@GuruStron谢谢你和我一起思考。当我点击您提供的链接时,我看到您实际上已经能够使其工作;我错过了什么吗?
0赞 Mike Nakis 3/11/2023
你只会收到关于过时成员覆盖非过时成员的警告,正如我已经说过的,需要禁止。我不带任何论据,但只要适合你。System.Obsolete
0赞 Guru Stron 3/11/2023
我试图表明的是,将属性应用于覆盖并不能阻止使用。Obsoleteobject.Equals

答:

1赞 Guru Stron 3/11/2023 #1
  1. 有没有办法为记录结构提供我自己的“Equals(object?)”方法,而不是被编译器自动生成的方法所困扰?

    不,事实并非如此,正如记录结构规范所说:

    记录结构包括一个合成的重写,等效于声明如下的方法:

    public override readonly bool Equals(object? obj);
    

    如果显式声明重写,则为错误。

  2. 有谁知道任何解决方法?

    您可以尝试使用像 Fody 这样的东西来研究一些汇编编织,但据我所知,这发生在编译之后,因此它不会涵盖所有可能的场景(即不适用于相同的汇编用法)。

    就我个人而言,我会考虑转储该方法并尝试实现 Roslyn 分析器,它将处理您尝试解决的类型不匹配问题。ObsoleteAttribute