C# 编译器在实现 == 和 != 运算符记录定义时发出编译错误

皮疹

根据以下示例,我有一个记录:

public record MyData
{
   public string Id { get; set; }
   public string Code { get; set; }
   public string Description { get; set; }
   
   public bool operator ==(MyData d1, MyData d2)
   {
      return d1.Id == d2.Id;
   }

   public bool operator !=(MyData d1, MyData d2)
   {
      return d1.Id != d2.Id;
   }
}

这是我收到的错误消息,我不知道如何解决!

错误 CS0111:“MyData”类型已经定义了一个名为“op_Equality”的成员,具有相同的参数类型。

当我转换recordclass这个问题解决了,但由于一些原因,我们必须用不断record摆脱这个编译问题的解决方案是什么?

卡桑德拉德

它是根据规格设计的

对于记录,编译器生成 Equals 方法。在实践中,记录中值相等的实现速度明显更快

在类类型中,您可以手动覆盖相等方法和运算符以实现值相等,但开发和测试该代码将非常耗时且容易出错。内置此功能可防止在添加或更改属性或字段时因忘记更新自定义覆盖代码而导致的错误。

这意味着record如果您打算覆盖相等运算符,则不应选择类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C和C ++编译器如何实现浮点数相等的决定?

编译器如何实现C ++继承?

C编译器参考实现

隐式运算符和编译器错误

RCPP和默认的C ++编译器

解决此编译错误:标识符“和”是C ++ [-Werror = c ++-compat]中的特殊运算符名称吗?

为什么 C# 编译器不调用隐式运算符。编译错误?

编译器如何编译模板和类型检查?(C ++)

本机c ++编译器和.net c ++编译器有什么区别?

C和DLC编译器的奇怪解析错误

C ++编译器如何区分令牌>>用于二进制运算符和模板

C ++编译器是否将所有后缀运算符重载都视为相同(-和-的后缀版本)?

Turbo C ++和Borland C ++编译器之间的区别

C ++编译器如何区分*运算符的用法?

空传播运算符,输出参数和错误的编译器错误?

C ++编译器的“浅”副本和赋值

64位整数和较旧的C ++编译器

C++ 方法覆盖和重载(编译器级别)

C ++编译器优化和短路评估

static_assert和Intel C ++编译器

C ++编译器如何扩展前缀和后缀operator ++()?

运算符重载和函数重载产生不明确的编译器错误

尝试使用 ValueNotifier 和 ValueListenable 实现极简架构时遇到编译器错误

实现流运算符时编译错误

编译器错误C2280,尝试引用已删除的函数运算符=

C ++,实现函数`int next(std :: string param)`时出现奇怪的编译器错误

C 编译器 (GCC) 在使用 Flex 和 Bison 时出现几个错误

C:运算符'->'的问题,编译但返回错误。有main.c和.h,.c文件

Clojure编译器是否检查记录和类型是否实现协议?