Variables 为什么dart错误地推断了我的泛型参数类型?
当我清楚地将mySet变量等同于int-set-literal时,我似乎不理解为什么mySet变量被推断为具有动态参数类型的泛型集。那么,这个结果是合乎逻辑的,还是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' };
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
。