我无法理解Dart编辑器如何分析源代码

时间:2014-03-02 10:29:49

标签: dart code-analysis software-quality error-detection dart-sdk

Dart编辑器版本1.2.0.release(STABLE)。 Dart SDK版本1.2.0。

此源代码会产生运行时异常。

void main() {
  test(new Base());
}

void test(Child child) {
}

class Base {
}

class Child extends Base {
}

我认为分析仪会生成这样的东西。

The argument type 'Base' cannot be assigned to the parameter type 'Child'

但是我只能在发生此异常(事后)时在运行时检测到此错误。

Unhandled exception:
type 'Base' is not a subtype of type 'Child' of 'child'.

2 个答案:

答案 0 :(得分:6)

分析仪遵循此处的语言规范。

它只会警告参数表达式的静态类型是否不能赋值给参数的函数类型。

在Dart中,如果任一类型是另一种类型的子类型,则一种类型的表达式可分配给另一种类型的变量。

这不是一种安全的类型检查。它找不到所有可能的错误。另一方面,它也不会禁止一些正确的用途,例如:

Base foo = new Child();
void action(Child c) { ... }
action(foo);  // Perfectly correct code at runtime.

其他语言有安全的分配检查,但它们也会阻止一些正确的程序。然后,您必须添加(不安全/运行时检查)强制转换操作符,以告诉编译器您知道该程序是安全的。这是Dart选择宽容并避免大多数演员阵容的权衡。

答案 1 :(得分:1)

让我们试着保持礼貌并毫无偏见地回答这个问题。

我想我理解你的期望,并且在这里我对错误意味着什么的角度:

  1. 您正在使用类型为Base
  2. 的参数调用该方法
  3. 该方法期望类型为Child
  4. 的参数
  5. Child不等于Base,也不是它的子类型(事实上它是Child,它是Base的子类型)
  6. 它正在按预期工作,因为只提供预期类型的​​对象(或它的子类型 - 特化)才有意义。

    <小时/>

    更新

    再次阅读你的问题后,我意识到你指出编辑器没有找到类型问题。我认为这是因为Dart程序是动态的,因此在运行时之前不会进行某些检查。

    希望它有所帮助; - )