跳到主要內容

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()};