Pular para o conteúdo principal

ambiguous_set_or_map_literal_either

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

This literal must be either a map or a set, but the elements don't have enough information for type inference to work.

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 e todos os elementos são elementos spread (que são permitidos nos dois tipos de literal), o analisador usa os tipos das expressões que estão sendo espalhadas. Se todas as expressões tiverem o tipo Iterable, é um literal de conjunto; se todas tiverem o tipo Map, é um literal de mapa.

Este diagnóstico é emitido quando nenhuma das expressões espalhadas tem um tipo que permita ao analisador decidir se você estava escrevendo um literal de mapa ou de conjunto.

Exemplo

#

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

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

O problema ocorre porque não há argumentos de tipo e não há informação sobre o tipo de a ou de b.

Correções comuns

#

Há três formas comuns de corrigir este problema. A primeira é adicionar argumentos de tipo ao literal. Por exemplo, se o literal deve ser um literal de mapa, você pode escrever algo como isto:

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

A segunda correção é adicionar informação de tipo para que as expressões tenham o tipo Iterable ou o tipo Map. Você pode adicionar um cast explícito ou, neste caso, adicionar tipos às declarações dos dois parâmetros:

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

A terceira é adicionar informação de contexto. Neste caso, isso significa adicionar um tipo de retorno à função:

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

Em outros casos, você pode adicionar um tipo em outro lugar. Por exemplo, suponha que o código original seja assim:

dart
union(a, b) {
  var x = {...a, ...b};
  return x;
}

Você pode adicionar uma anotação de tipo em x, assim:

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

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ê.