Dart 'as'运算符与C类型转换的异同及报错问题咨询
Dart 'as' 运算符与C语言类型转换的异同
核心区别
- C语言类型转换:属于强制类型转换,会直接改变数据的存储形式或对数值进行截断/转换,生成一个新的目标类型值。比如把
double转为int时,会直接砍掉小数部分,得到一个全新的int值,原数据不受影响。 - Dart 'as' 运算符:本质是类型断言,它并不改变对象的类型或值,只是向编译器声明“这个对象的运行时类型就是目标类型(或其子类型)”。如果断言符合实际情况,就返回原对象;如果不符合,直接抛出类型转换错误。
你的代码报错原因
你执行的代码中,x / y的结果是double类型(哪怕计算结果是整数,比如4.0,它依然是double类型),而double并不是int的子类型,所以as int的断言不成立,触发了你看到的错误。
正确的数值转换方法
如果需要将double转为int,不要用as,而是使用Dart提供的数值转换方法:
- 截断小数部分:
(x / y).toInt(),例如4.45.toInt()返回4 - 四舍五入:
(x / y).round(),例如4.5.round()返回5 - 向上取整:
(x / y).ceil(),例如4.1.ceil()返回5 - 向下取整:
(x / y).floor(),例如4.9.floor()返回4
'as'运算符的正确使用场景
只有当你明确知道某个对象的运行时类型是目标类型(或其子类型)时,才适合用as。比如:
Object obj = "Dart"; String str = obj as String; // 正确,因为obj实际是String类型
内容的提问来源于stack exchange,提问作者Siavash TS
相关产品推荐
相关产品推荐

