ambiguous_extension_member_access
成员 '{0}' 在 '{1}' 和 '{2}' 中定义,并且没有哪个更具体。
成员 '{0}' 在 {1} 中定义,并且没有哪个更具体。
描述
#当代码引用一个对象的成员(例如,o.m()
或 o.m
或 o[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);
}