Dart 条件表达式的类型检查
在以下代码中:Dart 条件表达式的类型检查,dart,Dart,在以下代码中: main() { print('Starting....'); int x = 10; int y = x > 3 ? 'aaa' : 7; print(y); } 这是输出: 开始。。。。 未处理的异常: 类型“String”不是类型“int”的子类型 #0主(file:///tmp/main.dart:4:12) #1_星状。(省道:隔离补片/隔离补片。省道:301:19) #2 RawReceivePortImpl.handleMessage
main() {
print('Starting....');
int x = 10;
int y = x > 3 ? 'aaa' : 7;
print(y);
}
这是输出:
开始。。。。
未处理的异常:
类型“String”不是类型“int”的子类型
#0主(file:///tmp/main.dart:4:12)
#1_星状。(省道:隔离补片/隔离补片。省道:301:19)
#2 RawReceivePortImpl.handleMessage(dart:隔离补丁/隔离补丁。dart:168:12)
为什么对y的赋值没有编译时错误?为什么只有运行时错误
版本:Dart VM版本:2.8.4(稳定)(未知时间戳)(在“linux_x64”上)
谢谢 您正在尝试分析名为int的类型中的字符串“aaa”。“aaa”不是数字,因此出现错误
String y = x > 3 ? 'aaa' : '7';
或者:
int y = x > 3 ? 2 : 7;
原因是Dart仍然尝试将隐式类型转换作为默认行为。因此,在这种情况下,Dart将自动假定您可以将
字符串
转换为int
。可以禁用此行为,并且在支持非Null类型时默认情况下也将禁用此行为:
您可以将以下内容添加到analysis\u options.yaml
(我也建议添加隐式动态:false
,但这对于此特定问题不是必需的):
分析器:
强模式:
隐式类型转换:false
然后,您将从分析器中获得一个错误:
正在分析bin/stackoverflow.dart。。。
错误•无法将“Object”类型的值分配给“int”类型的变量。•箱子/堆垛溢出。省道:4:11•无效的_分配
发现1个错误。
错误显示为
Object
的原因是Dart分析了x>3?“aaa':7进入对象的返回类型
,因为这是int
和String
的唯一共同点,我相信OP理解错误。他们想知道为什么不在编译时捕获,而不是像现在这样只在运行时捕获。你的意思是为什么没有编译时错误?我认为这是一个bug。应该引发编译错误。对于记录,Dart不假定String
可分配给int
。这是e1?e2:e3
是e2
和e3
类型中的最小上界,int
和sting
的最小上界是Object
(如您所说),然后允许从Object
到int
的隐式向下转换。后者将使用零安全性进行固定。