繁体   English   中英

为什么dart分析仪无法识别类型错误?

[英]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 的盲目复制粘贴产生的。如果_remoteConfignull ,则执行命中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

我想你在问两个问题:

  1. 为什么分析器不抱怨_defaults.containsKey(key) && _defaults[key]

  2. 为什么分析器不抱怨沿其两条路径具有不同类型的三元表达式?

对于#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM