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};