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
的隐式向下转换。后者将使用零安全性进行固定。