ambiguous_set_or_map_literal_either
このリテラルはマップまたはセットのいずれかでなければなりませんが、要素には型推論を機能させるための十分な情報がありません。
説明
#マップとセットのリテラルは同じ区切り文字 ({ および }) を使用するため、アナライザーは型引数と要素を見て、どの種類のリテラルを意図しているかを判断します。型引数がなく、すべての要素がスプレッド要素 (どちらのリテラルにも許可されます) である場合、アナライザーはスプレッドされている式の型を使用します。すべての式が Iterable 型の場合、それはセットリテラルになります。それらすべてが Map 型の場合、それはマップリテラルになります。
この診断は、スプレッドされている式のいずれも、アナライザーがマップリテラルまたはセットリテラルのどちらを記述しているかを判断できる型を持たない場合に生成されます。
例
#次のコードは、この診断を生成します
union(a, b) => {...a, ...b};この問題は、型引がなく、a または b のどちらかの型の情報がないために発生します。
一般的な修正
#この問題を解決するには、主に 3 つの方法があります。1 つ目は、リテラルに型引数を追加することです。たとえば、リテラルがマップリテラルであることを意図している場合は、次のように記述できます。
union(a, b) => <String, String>{...a, ...b};2 つ目の解決策は、式が Iterable 型または Map 型になるように型情報 を追加することです。明示的なキャストを追加するか、この場合は 2 つのパラメーターの宣言に型を追加できます。
union(List<int> a, List<int> b) => {...a, ...b};3 つ目の解決策は、コンテキスト情報 を追加することです。この場合、それは関数の戻り型を追加することを意味します。
Set<String> union(a, b) => {...a, ...b};他の場合では、どこか別の場所で型を追加することもあります。たとえば、元のコードが次のようになっているとします。
union(a, b) {
var x = {...a, ...b};
return x;
}次のように、x に型注釈 を追加できます。
union(a, b) {
Map<String, String> x = {...a, ...b};
return x;
}