代码之家  ›  专栏  ›  技术社区  ›  Rémi Rousselet

为什么'if(var=null)`在dart中编译?

  •  3
  • Rémi Rousselet  · 技术社区  · 6 年前

    我最近碰到这个问题 How do I solve the 'Failed assertion: boolean expression must not be null' exception in Flutter

    问题从何而来 应该是 被视为有效的无效代码。

    此代码可概括为:

    int stuff;
    if (stuff = null) { // = instead of ==
    }
    

    但这段代码为什么要编译呢?因为下面不会。

    int stuff;
    if (stuff = 42) {
    }
    

    出现以下编译错误:

    条件必须具有静态类型“bool”。

    所以我想不一致的是 if (stuff = null) 同样的错误。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nate Bosch    6 年前

    当你说 var stuff; 没有初始值 stuff 静态类型 dynamic 是的。自从 dyamic 可以 成为 bool ,转让是合法的 null 到类型的变量 动态 ,并且在条件中使用可能为空的bool是合法的,编译器不会对此进行标记。当你说 int stuff; 编译器知道 东西 不可能是 布尔 .在这种情况下报告的错误是由静态类型 东西 ,而不是分配给 无效的 是的。

    编辑:从一个知道如何阅读规范的人那里得到了真正的答案。

    赋值表达式的静态类型是赋值的右侧。所以这个表达式 stuff = null 静态类型为 Null 可转让给 布尔 是的。

    原因是 价值 作业的右边,所以使用它的类型也是有意义的。这允许使用以下表达式:

    int foo;
    num bar;
    foo = bar = 1;
    
        2
  •  5
  •   Günter Zöchbauer    6 年前

    null bool 变量,至少直到DART支持不可为空的类型。

    bool foo = null;
    

    或者只是

    bool foo;
    

    是有效的。

    因此,在第一种情况下,从静态分析的角度来看没有什么错。

    在第二种情况下 int 是因为赋值而推断的,已知赋值不是有效的布尔值。

    bool foo = 42; 
    

    无效。