ambiguous_set_or_map_literal_both
字面量不能同时是 map 或 set,因为它既包含至少一个字面 map 条目或展开操作符展开的 'Map',又包含至少一个不是这些的元素。
描述
#由于 map 和 set 字面量使用相同的分隔符({
和 }
),分析器会检查类型参数和元素来确定您 intended 哪种字面量。如果没有类型参数,分析器会使用元素的类型。如果所有元素都是字面 map 条目并且所有展开操作符都展开一个 Map
,则它是一个 Map
。如果没有任何元素是字面 map 条目并且所有展开操作符都展开一个 Iterable
,则它是一个 Set
。如果这两者都不是,那么就是模棱两可的。
当至少一个元素是字面 map 条目或展开操作符展开一个 Map
,并且至少一个元素不是这些时,分析器会产生此诊断,从而无法确定您是在编写 map 字面量还是 set 字面量。
示例
#以下代码会产生此诊断
dart
union(Map<String, String> a, List<String> b, Map<String, String> c) =>
{...a, ...b, ...c};
列表 b
只能展开到 set 中,而 map a
和 c
只能展开到 map 中,字面量不能同时是两者。
常见修复
#解决这个问题有两种常见的方法。第一种是移除某种类型的展开元素,以便元素保持一致。在这种情况下,这可能意味着移除列表并决定如何处理现在未使用的参数
dart
union(Map<String, String> a, List<String> b, Map<String, String> c) =>
{...a, ...c};
第二种修复方法是将某种类型的元素更改为与另一类元素一致的元素。例如,您可以将列表元素作为映射到自身的值的键添加到 map 中
dart
union(Map<String, String> a, List<String> b, Map<String, String> c) =>
{...a, for (String s in b) s: s, ...c};