Pular para o conteúdo principal

ambiguous_set_or_map_literal_both

Detalhes sobre o diagnóstico 'ambiguous_set_or_map_literal_both' produzido pelo analisador do Dart.

The literal can't be either a map or a set because it contains at least one literal map entry or a spread operator spreading a 'Map', and at least one element which is neither of these.

Descrição

#

Como literais de mapa e de conjunto usam os mesmos delimitadores ({ e }), o analisador observa os argumentos de tipo e os elementos para determinar qual tipo de literal você quis dizer. Quando não há argumentos de tipo, o analisador usa os tipos dos elementos. Se todos os elementos são entradas de mapa literais e todos os operadores spread estão espalhando um Map, então é um Map. Se nenhum dos elementos é uma entrada de mapa literal e todos os operadores spread estão espalhando um Iterable, então é um Set. Se nenhuma dessas condições for verdadeira, a situação é ambígua.

O analisador emite este diagnóstico quando pelo menos um elemento é uma entrada de mapa literal ou um operador spread que espalha um Map, e pelo menos um elemento não é nenhum desses, tornando impossível para o analisador determinar se você está escrevendo um literal de mapa ou de conjunto.

Exemplo

#

O código a seguir produz este diagnóstico:

dart
union(Map<String, String> a, List<String> b, Map<String, String> c) => {
  ...a,
  ...b,
  ...c,
};

A lista b só pode ser espalhada em um conjunto, e os mapas a e c só podem ser espalhados em um mapa; o literal não pode ser os dois ao mesmo tempo.

Correções comuns

#

Há duas formas comuns de corrigir este problema. A primeira é remover todos os elementos spread de um tipo ou de outro, para que os elementos fiquem consistentes. Nesse caso, isso provavelmente significa remover a lista e decidir o que fazer com o parâmetro que ficou sem uso:

dart
union(Map<String, String> a, List<String> b, Map<String, String> c) => {
  ...a,
  ...c,
};

A segunda correção é alterar os elementos de um tipo para elementos consistentes com os outros. Por exemplo, você pode adicionar os elementos da lista como chaves que mapeiam para si mesmas:

dart
union(Map<String, String> a, List<String> b, Map<String, String> c) => {
  ...a,
  for (String s in b) s: s,
  ...c,
};

Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.