メインコンテンツにスキップ

ambiguous_set_or_map_literal_both

リテラルは、少なくとも1つのリテラルマップエントリまたはMapをスプレッドするスプレッド演算子を含み、かつ、それ以外の要素を少なくとも1つ含むため、マップでもセットでもありません。

説明

#

マップリテラルとセットリテラルは同じ区切り文字({})を使用するため、アナライザーは型引数と要素を見て、どちらのリテラルを意図しているかを判断します。型引数がない場合、アナライザーは要素の型を使用します。すべての要素がリテラルマップエントリであり、すべてのスプレッド演算子がMapをスプレッドしている場合、それはMapです。要素にリテラルマップエントリがなく、すべてのスプレッド演算子がIterableをスプレッドしている場合、それはSetです。どちらも真でない場合、あいまいになります。

アナライザーは、少なくとも1つの要素がリテラルマップエントリまたはMapをスプレッドするスプレッド演算子であり、かつ、少なくとも1つの要素がそれ以外のいずれでもない場合にこの診断を生成します。これにより、アナライザーはマップリテラルを記述しているのかセットリテラルを記述しているのかを判断できなくなります。

#

次のコードは、この診断を生成します

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

リストbはセットにのみスプレッドでき、マップacはマップにのみスプレッドでき、リテラルは両方にはなれません。

一般的な修正

#

この問題を修正するには、一般的に2つの方法があります。1つ目は、どちらか一方の種類のすべてのスプレッド要素を削除して、要素を一致させることです。この場合、おそらくリストを削除し、現在使用されていないパラメータをどうするかを決定する必要があります。

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

2つ目の修正は、一方の種類の要素を、もう一方の要素と一致する要素に変更することです。たとえば、リストの要素をそれ自身にマッピングするキーとして追加することができます。

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