跳到主要内容

ambiguous_set_or_map_literal_either

此字面量必须是 map 或 set,但其元素没有足够的信息供类型推断工作。

描述

#

因为 map 和 set 字面量使用相同的分隔符({}),分析器会查看类型参数和元素来确定您想要哪种类型的字面量。当没有类型参数且所有元素都是展开元素(两种字面量都允许)时,分析器会使用被展开的表达式的类型。如果所有表达式都具有 Iterable 类型,那么它是 set 字面量;如果它们都具有 Map 类型,那么它是 map 字面量。

当被展开的表达式都没有一个类型让分析器能够确定您是想写 map 字面量还是 set 字面量时,就会产生此诊断信息。

示例

#

以下代码会产生此诊断信息:

dart
union(a, b) => {...a, ...b};

此问题发生是因为没有类型参数,并且关于 ab 的类型没有任何信息。

常见修复方法

#

有三种常见的解决方法。第一种是给字面量添加类型参数。例如,如果字面量打算是一个 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;
}