代码之家  ›  专栏  ›  技术社区  ›  kikap

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

  •  0
  • kikap  · 技术社区  · 4 年前

    代码如下:

    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);
    }
    

    这个bug很明显(我很惭愧,是由类似的盲目复制粘贴造成的) getBool(key) 功能。如果 _remoteConfig null ,执行击中 bool && String path和我得到运行时异常 type 'String' is not a subtype of type 'bool' 。完全合法,但为什么分析器看不到它?执行流程非常清晰,一条路径返回 String 另一条路径(理论上)返回 dynamic 返回类型为 字符串 这意味着所有路径都返回 字符串 . 我不明白什么?

    飞镖2.12.0 迂腐的1.11.0

    分析器选项:

    include: package:pedantic/analysis_options.yaml
    
    analyzer:
      exclude:
        - lib/generated/*
        - lib/**/*.g.dar
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   jamesdlin    4 年前

    我想你问了两个问题:

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

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

    #1:因为 _defaults[key] 返回类型 dynamic (这可能是 bool 在运行时),我预计不会收到分析投诉。

    对于#2:由于两条路径的类型不同, 三元表达式的类型是公共基类型 : Object 如果隐式转换被启用, 对象 然后自动转换为 String 返回类型。

    分析仪 如果你发现这两个错误 disable implicit casts 在你的 analysis_options.yaml 配置文件:

    analyzer:
      strong-mode:
        implicit-casts: false
    

    运行分析仪然后打印:

    error运算符“&”的操作数&'必须在…处分配给'bool'。。。(非机具)

    error无法从函数“getString”返回“Object”类型的值,因为它在…处的返回类型为“String”。。。(返回_of_invalid_type)

    (我很惊讶 implicit-casts: false 触发分析错误 && 带a的表达式 动态 操作数,;也许我的理解不太准确,或者这可能是分析器中的一个错误。)