case_expression_type_implements_equals 진단: case 표현식 타입이 == 연산자를 재정의했을 때

case_expression_type_implements_equals 진단: case 표현식 타입이 == 연산자를 재정의했을 때

switch 문의 case 뒤에 오는 표현식의 타입이 Object에 정의된 == 연산자 외에 다른 구현을 갖고 있으면, 그 타입으로는 case 매칭이 예측대로 동작하지 않을 수 있어요. 이때 Dart 분석기가 case_expression_type_implements_equals 진단을 알려줘요.

출처: case_expression_type_implements_equals

본문

설명

분석기는 case 키워드 뒤에 오는 표현식의 타입이 Object에 있는 == 연산자 외에 다른 == 연산자 구현을 갖고 있을 때 이 진단을 만들어요.

예시

다음 코드는 case 키워드 뒤의 표현식(C(0))이 타입 C를 가지는데, 클래스 C== 연산자를 재정의하기 때문에 이 진단을 만들어요.

class C {
  final int value;

  const C(this.value);

  @override
  bool operator ==(Object other) {
    return false;
  }
}

void f(C c) {
  switch (c) {
    case C(0):
      break;
  }
}

흔한 해결 방법

강한 이유가 없다면 코드를 if-else 구조로 다시 작성해요.

class C {
  final int value;

  const C(this.value);

  @override
  bool operator ==(Object other) {
    return false;
  }
}

void f(C c) {
  if (c == C(0)) {
    // ...
  }
}

switch 문을 다시 작성할 수 없고 == 구현도 필요하지 않다면, 그 구현을 제거해요.

class C {
  final int value;

  const C(this.value);
}

void f(C c) {
  switch (c) {
    case C(0):
      break;
  }
}

switch 문을 다시 작성할 수도 없고 == 정의를 제거할 수도 없다면, switch를 제어하는 데 쓸 수 있는 다른 값을 찾아봐요.

class C {
  final int value;

  const C(this.value);

  @override
  bool operator ==(Object other) {
    return false;
  }
}

void f(C c) {
  switch (c.value) {
    case 0:
      break;
  }
}

더 알아보기