Variables 为什么dart错误地推断了我的泛型参数类型?

Variables 为什么dart错误地推断了我的泛型参数类型?,variables,generics,dart,types,collections,Variables,Generics,Dart,Types,Collections,当我清楚地将mySet变量等同于int-set-literal时,我似乎不理解为什么mySet变量被推断为具有动态参数类型的泛型集。那么,这个结果是合乎逻辑的,还是dart真的无法推断泛型集合参数类型 main(){ Set mySet = {1 ,2 , 3}; var myProducts = { 1:'TV',2:'Refrigerator', 3:mySet.lookup(2), 4:'Tablet', 5:'Computer' };

当我清楚地将mySet变量等同于int-set-literal时,我似乎不理解为什么mySet变量被推断为具有动态参数类型的泛型集。那么,这个结果是合乎逻辑的,还是dart真的无法推断泛型集合参数类型

main(){
  Set mySet = {1 ,2 , 3};
  var myProducts = {
    1:'TV',2:'Refrigerator',
    3:mySet.lookup(2),
    4:'Tablet',
    5:'Computer'
    };
    var userCollection = {"name":"John Smith","Email":"john@sanjib.site"};
    myProducts.forEach((x,y) => print("${x} : ${y}"));
    userCollection.forEach((k, v) => print("${k} : ${v}"));
}

如果使用泛型类型
G
声明变量,但忽略参数化类型,则这是使用
G
的缩写。推理确实发生在你的作业中,但不是在你期望的方向上:
{1,2,3}
的类型被推断为
{1,2,3}
,而不是作为
{1,2,3}

您可以通过设置以下内容来捕获此类错误:

分析器:
语言:
严格原始类型:true
在您的
analysis\u options.yaml
文件中。(您还可能希望启用:

分析器:
强模式:
隐式类型转换:false
隐式动态:false
我也是。)

另见:

void main(){
列表a=[1,2,3];
}
开发人员通常认为,推理填充了赋值右侧的
a
类型。它可能看起来像
a
具有类型
列表
。但Dart使用
动态
(或相应类型参数的边界)填充省略的类型参数,如
列表上的
E
<代码>列表a
纯粹是
列表a的简写。然后,推理从
a
流到赋值右侧的表达式上


因此,在这种情况下并没有真正进行推理,因为默认情况下,如果我省略了一个参数类型,那么参数类型是动态的?@vecohah推理是在从左侧推断右侧的情况下进行的,这与您想要的方向相反。因此,由于省略,右侧默认为动态参数类型,因此右侧被推断为一组参数类型dynamic?@vecohah通常情况下,RHS本身将被推断为
{1,2,3}
,但因为LHS明确指定了类型(
Set
,相当于
Set
),RHS被调整为与左侧匹配。如果您使用
var
final
声明变量,则您的变量将被推断为
Set