relational_pattern_operand_type_not_assignable 진단: 관계 패턴의 피연산자 타입이 연산자 파라미터와 맞지 않아요

relational_pattern_operand_type_not_assignable 진단: 관계 패턴의 피연산자 타입이 연산자 파라미터와 맞지 않아요

Dart 분석기가 내보내는 진단에는 이름이 있어요. relational_pattern_operand_type_not_assignable관계 패턴(relational pattern)의 피연산자 타입이, 호출될 연산자의 파라미터 타입에 할당될 수 없을 때 Dart 분석기가 알려주는 컴파일 타임 진단이에요. 관계 패턴에서 실제로 어떤 연산자가 호출되는지, 그리고 그 연산자가 요구하는 타입이 무엇인지를 짚어주는 진단이에요.

출처: relational_pattern_operand_type_not_assignable

본문

설명

분석기는 관계 패턴의 피연산자 타입이, 호출될 연산자의 파라미터에 할당될 수 없는 타입일 때 이 진단을 만들어요. 다시 말해 패턴에 쓴 값과 연산자가 기대하는 값의 타입이 서로 안 맞는다는 뜻이에요.

예시

다음 코드는 관계 패턴의 피연산자(0)가 int인데, C에 정의된 > 연산자는 C 타입의 객체를 기대하기 때문에 이 진단을 만들어요.

class C {
  const C();

  bool operator >(C other) => true;
}

void f(C c) {
  switch (c) {
    case > 0:
      print('positive');
  }
}

흔한 해결 방법

switch가 올바른 값을 사용하고 있다면, case가 비교하는 값을 올바른 타입의 객체로 바꿔요.

class C {
  const C();

  bool operator >(C other) => true;
}

void f(C c) {
  switch (c) {
    case > const C():
      print('positive');
  }
}

switch가 잘못된 값을 사용하고 있다면, 매칭되는 값을 계산하는 표현식을 바꿔요.

class C {
  const C();

  bool operator >(C other) => true;

  int get toInt => 0;
}

void f(C c) {
  switch (c.toInt) {
    case > 0:
      print('positive');
  }
}

더 알아보기