Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 有三件事我不知道';我听不懂,你能解释一下吗?_Dart - Fatal编程技术网

Dart 有三件事我不知道';我听不懂,你能解释一下吗?

Dart 有三件事我不知道';我听不懂,你能解释一下吗?,dart,Dart,我是dart新手,这是我在代码中经常遇到的三种情况。 有人能解释为什么在运行代码之前没有检测到这些错误吗? 有没有什么“严格”的标志,使飞镖。。。更“严格”:?。 有没有关于如何避免此类错误的建议 很抱歉将这些示例归为一个问题,但自从我开始使用dart(实际上是颤振)以来,这些示例更为频繁 导入'dart:io'; void main(){ 例a(); //例b(); //例c(); } 例a(){ 最终文件=文件('File.txt'); 最终字符串text=file!=null?文件:“ab

我是dart新手,这是我在代码中经常遇到的三种情况。 有人能解释为什么在运行代码之前没有检测到这些错误吗? 有没有什么“严格”的标志,使飞镖。。。更“严格”:?。 有没有关于如何避免此类错误的建议

很抱歉将这些示例归为一个问题,但自从我开始使用dart(实际上是颤振)以来,这些示例更为频繁

导入'dart:io';
void main(){
例a();
//例b();
//例c();
}
例a(){
最终文件=文件('File.txt');
最终字符串text=file!=null?文件:“abc”;//没有“编译错误”,VS代码中没有错误
//未处理的异常:
//类型“\u File”不是“String”类型的子类型
}
例b(){
无效接受列表(列表列表){}
最终列表=[1,2,3]。地图((el)=>el);
acceptList(list);//没有“编译错误”,VS代码中没有错误
//未处理的异常:
//类型“MappedListIterable”不是类型“List”的子类型
}
//例C
//下面的示例导致类方法的'dynamic'类型“泄漏”
类MyClass{
myMethod(){//VS代码说它是“dynamicMyMethod()”-这里很难猜测返回类型吗?
返回“”;
}
}
例c(){
最终文件File=MyClass().myMethod();
//未处理的异常:
//类型“String”不是类型“File”的子类型
}
//另一方面
final myClosure=(){//VS代码说它是“String Function()myClosure”,所以它猜到了这里的类型
返回"自卫队";;
};

在Dart的下一个版本(2.12)中,示例A和B都将成为错误

除了引入空安全性,2.12版还删除了“隐式降级”,这允许您将
Iterable
分配给
List
变量,并允许您分配“字符串或
文件
”(然后组合起来表示“任何
对象
)到
字符串
变量。您必须选择空安全以获得此功能(但无论如何您都应该)

MyClass.myMethod
dynamic
作为返回类型是您必须避免的事情。您只需编写返回类型
字符串
,就可以解决这个问题。 或者你可以在分析器中添加“无隐式动态”的额外警告,然后它应该(我想!)在这里警告你。。。然后您可以编写
字符串


myClosure
得到一个推断的返回类型,而
MyClass.myMethod
没有,这是因为Dart类型推断依赖于类在开始键入表达式之前是完全类型的。这避免了推理中循环依赖的一些风险(或者至少将其最小化)。这也意味着类方法声明无法从其主体获取其类型,因此必须显式地键入实例方法。(变量也有一些例外,但一般来说,为公共API编写类型)。

示例A和B在Dart的下一个版本(2.12)中都会出错

除了引入空安全性,2.12版还删除了“隐式降级”,这允许您将
Iterable
分配给
List
变量,并允许您分配“字符串
文件
”(然后组合起来表示“任何
对象
)到
字符串
变量。您必须选择空安全以获得此功能(但无论如何您都应该)

MyClass.myMethod
dynamic
作为返回类型是您必须避免的事情。您只需编写返回类型
字符串
,就可以解决这个问题。 或者你可以在分析器中添加“无隐式动态”的额外警告,然后它应该(我想!)在这里警告你。。。然后您可以编写
字符串

myClosure
得到一个推断的返回类型,而
MyClass.myMethod
没有,这是因为Dart类型推断依赖于类在开始键入表达式之前是完全类型的。这避免了推理中循环依赖的一些风险(或者至少将其最小化)。这也意味着类方法声明无法从其主体获取其类型,因此必须显式地键入实例方法。(关于变量也有一些例外,但一般来说,为公共API编写类型)