Invalid implementation of `==` or `hashCode` in a constant set elementDRT-W1275
The analyzer produces this diagnostic when the class of object used as an
element in a constant set literal implements either the ==
operator, the
getter hashCode
, or both. The implementation of constant sets uses both
the ==
operator and the hashCode
getter, so any implementation other
than the ones inherited from Object
requires executing arbitrary code at
compile time, which isn't supported.
Example
The following code produces this diagnostic because the constant set
contains an element whose type is C
, and the class C
overrides the
implementation of ==
:
class C {
const C();
bool operator ==(Object other) => true;
}
const set = {C()};
The following code produces this diagnostic because the constant set
contains an element whose type is C
, and the class C
overrides the
implementation of hashCode
:
class C {
const C();
int get hashCode => 3;
}
const map = {C()};
Common fixes
If you can remove the implementation of ==
and hashCode
from the
class, then do so:
class C {
const C();
}
const set = {C()};
If you can't remove the implementation of ==
and hashCode
from the
class, then make the set non-constant:
class C {
const C();
bool operator ==(Object other) => true;
}
final set = {C()};