跳到主要内容

ambiguous_extension_member_access

成员 '{0}' 在 '{1}' 和 '{2}' 中定义,并且没有哪个更具体。

成员 '{0}' 在 {1} 中定义,并且没有哪个更具体。

描述

#

当代码引用一个对象的成员(例如,o.m()o.mo[i]),而该对象的静态类型没有声明该成员(例如 m[])时,分析器会尝试在扩展中查找该成员。例如,如果成员是 m,则分析器会查找声明了名为 m 的成员且其扩展类型可以赋值给 o 的静态类型的扩展。当作用域中有多个此类扩展时,将选择其扩展类型最具体的扩展。

当没有哪个扩展的扩展类型比所有其他扩展的扩展类型更具体时,分析器会产生此诊断,从而使得对该成员的引用变得模糊不清。

示例

#

以下代码会产生此诊断,因为无法在 E1 中的成员和 E2 中的成员之间做出选择

dart
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) 来显式选择要使用的那个

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

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

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