ambiguous_set_or_map_literal_either
此字面量必须是 map 或 set,但其元素没有足够的信息供类型推断工作。
描述
#因为 map 和 set 字面量使用相同的分隔符({
和 }
),分析器会查看类型参数和元素来确定您想要哪种类型的字面量。当没有类型参数且所有元素都是展开元素(两种字面量都允许)时,分析器会使用被展开的表达式的类型。如果所有表达式都具有 Iterable
类型,那么它是 set 字面量;如果它们都具有 Map
类型,那么它是 map 字面量。
当被展开的表达式都没有一个类型让分析器能够确定您是想写 map 字面量还是 set 字面量时,就会产生此诊断信息。
示例
#以下代码会产生此诊断信息:
dart
union(a, b) => {...a, ...b};
此问题发生是因为没有类型参数,并且关于 a
或 b
的类型没有任何信息。
常见修复方法
#有三种常见的解决方法。第一种是给字面量添加类型参数。例如,如果字面量打算是一个 map 字面量,您可以这样写:
dart
union(a, b) => <String, String>{...a, ...b};
第二种修复方法是添加类型信息,以便表达式具有 Iterable
类型或 Map
类型。您可以添加显式转换,或者在本例中,给两个参数的声明添加类型:
dart
union(List<int> a, List<int> b) => {...a, ...b};
第三种修复方法是添加上下文信息。在本例中,这意味着给函数添加返回类型:
dart
Set<String> union(a, b) => {...a, ...b};
在其他情况下,您可以在其他地方添加类型。例如,假设原始代码看起来像这样:
dart
union(a, b) {
var x = {...a, ...b};
return x;
}
您可以像这样给 x
添加类型标注:
dart
union(a, b) {
Map<String, String> x = {...a, ...b};
return x;
}