case_expression_type_implements_equals 진단: case 표현식 타입이 == 연산자를 재정의했을 때
case_expression_type_implements_equals 진단: case 표현식 타입이 == 연산자를 재정의했을 때
switch 문의 case 뒤에 오는 표현식의 타입이 Object에 정의된 == 연산자 외에 다른 구현을 갖고 있으면, 그 타입으로는 case 매칭이 예측대로 동작하지 않을 수 있어요. 이때 Dart 분석기가 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;
}
}