[英]Why dart analyzer fails to recognize a type error?
这是代码:
static const _defaults = <String, dynamic>{
'api_key': '4839234792374',
'enabled': false,
'concurrency': 4,
};
String getString(String key) {
return _remoteConfig == null ?
_defaults.containsKey(key) && _defaults[key] :
_remoteConfig.getString(key);
}
该错误很明显(令我感到羞耻,是由类似的getBool(key)
function 的盲目复制粘贴产生的。如果_remoteConfig
是null
,则执行命中bool && String
路径,我得到运行时异常type 'String' is not a subtype of type 'bool'
。完全合法,但为什么分析器看不到它?执行流程非常清晰,一条路径返回String
,另一条路径(理论上)返回dynamic
,返回类型为String
,这意味着所有路径都返回String
. 什么我不明白?
Dart 2.12.0 迂腐 1.11.0
分析仪选项:
include: package:pedantic/analysis_options.yaml
analyzer:
exclude:
- lib/generated/*
- lib/**/*.g.dar
我想你在问两个问题:
为什么分析器不抱怨_defaults.containsKey(key) && _defaults[key]
?
为什么分析器不抱怨沿其两条路径具有不同类型的三元表达式?
对于#1:由于_defaults[key]
返回类型dynamic
(在运行时可能是bool
),我不希望分析投诉。
对于#2:由于两个路径具有不同的类型,因此三元表达式的类型是公共基本类型: Object
。 如果启用了隐式转换,则Object
会自动转换为String
返回类型。
如果您在analysis_options.yaml
配置文件中禁用隐式转换,分析器会捕获这两个错误:
analyzer:
strong-mode:
implicit-casts: false
运行分析器然后打印:
错误 • 运算符 '&&' 的操作数必须可在...处分配给 'bool' • (non_bool_operand)
错误 • 无法从 function 的“getString”返回类型为“Object”的值,因为它的返回类型为“String”... • (return_of_invalid_type)
(我很惊讶implicit-casts: false
会触发带有dynamic
操作数的&&
表达式的分析错误;也许我的理解不太准确,或者这可能是分析器中的错误。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.