非健全空安全模式下Dart analyzer未捕获空合并运算符类型不兼容问题
非健全空安全模式下Dart分析器的类型检查行为
问题背景
在非健全空安全模式(混合空安全与非空安全文件)的Flutter项目中,以下代码未被Dart analyzer报错且可编译:
int i = null; String s = ''; double d = i ?? s;
但将最后一行修改为:
double d = null ?? s;
时,分析器会抛出预期的类型错误。
原因分析
在非健全空安全模式下,Dart的类型检查规则为兼容旧非空安全代码做了放宽,具体差异如下:
- 第一段代码中,
i是legacy int类型(非空安全文件中默认可空),s是legacy String类型,i ?? s的静态推导类型为Object(int与String的共同父类)。非健全模式允许将Object隐式向下转型赋值给double变量,因此分析器不会触发报错——但这种代码在运行时如果i为null,会因String无法转换为double抛出运行时异常。 - 第二段代码中,
null ?? s的静态类型是明确的String,而String与double无继承或兼容关系,即使在非健全模式下,分析器也会检测到这种明显的类型不匹配,因此抛出错误。
结论
在非健全空安全模式下,Dart analyzer不会捕获第一段代码的错误,这是兼容旧代码的设计选择,而非分析器的bug。你的环境(Flutter 2.10.2 / Dart 2.16.1)符合该版本的非健全模式规则。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

