ambiguous_extension_member_access 진단: 어느 확장의 멤버인지 모호할 때

ambiguous_extension_member_access 진단: 어느 확장의 멤버인지 모호할 때

Dart 분석기가 내보내는 진단에는 이름이 있어요. ambiguous_extension_member_access확장(extension)으로 멤버를 찾을 때 어느 확장의 멤버인지 정할 수 없을 때 분석기가 알려주는 컴파일 타임 진단이에요. 확장이 여러 개 있고 서로 더 구체적이지 않으면 참조가 모호해져요.

출처: ambiguous_extension_member_access

본문

설명

코드가 어떤 객체의 멤버를 참조할 때(예: o.m() 또는 o.m, o[i]) 객체 o의 정적 타입이 그 멤버(m 또는 [] 등)를 선언하지 않는다면, 분석기는 확장에서 그 멤버를 찾으려 해요. 예를 들어 멤버가 m이라면, 분석기는 m이라는 멤버를 선언하면서도 o의 정적 타입을 할당할 수 있는 확장 타입(extended type)을 가진 확장들을 찾아요. 범위 안에 그런 확장이 여러 개 있을 때는 확장 타입이 가장 구체적인 확장이 선택돼요.

분석기는 어떤 확장도 다른 모든 확장의 확장 타입보다 더 구체적인 확장 타입을 갖지 않아서, 멤버에 대한 참조가 모호해질 때 이 진단을 만들어요.

예시

다음 코드는 E1의 멤버와 E2의 멤버 사이에서 선택할 방법이 없기 때문에 이 진단이 나와요.

extension E1 on String {
  int get charCount => 1;
}

extension E2 on String {
  int get charCount => 2;
}

void f(String s) {
  print(s.charCount);
}

흔한 해결 방법

두 확장이 모두 필요 없다면, 그중 하나를 삭제하거나 숨겨요.

둘 다 필요하다면, 확장 오버라이드(extension override)를 써서 사용하려는 확장을 명시적으로 선택해요.

extension E1 on String {
  int get charCount => length;
}

extension E2 on String {
  int get charCount => length;
}

void f(String s) {
  print(E2(s).charCount);
}

더 알아보기