illegal_concrete_enum_member 진단: Enum을 구현하는 곳에서 구체 멤버를 선언할 때

illegal_concrete_enum_member 진단: Enum을 구현하는 곳에서 구체 멤버를 선언할 때

Dart 분석기가 내보내는 진단에는 이름이 있어요. illegal_concrete_enum_memberEnum을 구현(implements)하는 클래스나 mixin에서 index, hashCode, == 같은 구체(구현이 있는) 인스턴스 멤버를 선언하거나 상속받을 때 분석기가 알려주는 진단이에요. 이 멤버들은 Enum이 이미 자체적으로 정의하고 있기 때문에, 그걸 다시 정의하면 충돌이 생겨요.

출처: illegal_concrete_enum_member

본문

설명

분석기는 enum 선언이나 Enum을 구현하는 클래스, 또는 on 절에 Enum을 둔 mixinindex, hashCode, == 라는 이름의 구체 인스턴스 멤버를 선언하거나 상속받을 때 이 진단을 만들어요.

예시

다음 코드는 enum Eindex라는 인스턴스 getter를 선언하기 때문에 이 진단이 나와요.

enum E {
  v;

  @override
  int get index => 0;
}

다음 코드는 Enum을 구현하는 클래스 ChashCode라는 인스턴스 필드를 선언하기 때문에 이 진단이 나와요.

abstract class C implements Enum {
  @override
  int hashCode = 0;
}

다음 코드는 클래스 A를 통해 Enum을 간접적으로 구현하는 클래스 ChashCode라는 인스턴스 getter를 선언하기 때문에 이 진단이 나와요.

abstract class A implements Enum {}

abstract class C implements A {
  @override
  int get hashCode => 0;
}

다음 코드는 on 절에 Enum을 둔 mixin M== 라는 연산자(operator)를 명시적으로 선언하기 때문에 이 진단이 나와요.

mixin M on Enum {
  @override
  bool operator ==(Object other) => false;
}

흔한 해결 방법

충돌하는 멤버의 이름을 바꿔요.

enum E {
  v;

  int get getIndex => 0;
}

더 알아보기