跳到主要内容

const_set_element_not_primitive_equality

(曾用名 const_set_element_type_implements_equals)

常量集合中的元素不能覆盖“==”运算符或“hashCode”,但类型“{0}”做到了。

描述

#

当用作常量集合字面量中元素的对象的类实现了 == 运算符、hashCode getter,或两者都实现时,分析器会产生此诊断。常量集合的实现使用了 == 运算符和 hashCode getter,因此除了从 Object 继承的实现之外的任何其他实现都需要在编译时执行任意代码,这是不受支持的。

示例

#

以下代码会产生此诊断,因为常量集合包含一个类型为 C 的元素,并且类 C 覆盖了 == 的实现。

dart
class C {
  const C();

  bool operator ==(Object other) => true;
}

const set = {C()};

以下代码会产生此诊断,因为常量集合包含一个类型为 C 的元素,并且类 C 覆盖了 hashCode 的实现。

dart
class C {
  const C();

  int get hashCode => 3;
}

const map = {C()};

常见修复方法

#

如果可以从类中移除 ==hashCode 的实现,请这样做

dart
class C {
  const C();
}

const set = {C()};

如果无法从类中移除 ==hashCode 的实现,则将该集合设为非常量

dart
class C {
  const C();

  bool operator ==(Object other) => true;
}

final set = {C()};