我不明白Dart Editor如何分析源代码



Dart Editor version 1.2.0.release (STABLE)。飞镖 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'.

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

仅当参数表达式的静态类型不可分配给参数的函数类型时,它才会发出警告。

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

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

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

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

让我们尽量保持礼貌,不带任何偏见地回答这个问题。

我想我明白你的期望,这是我对错误意味着什么的看法:

  1. 您正在使用 Base 类型的参数调用该方法
  2. 该方法需要 Child 类型的参数
  3. 子项不等于基数,也不是基数的子类型(事实上,子项
  4. 是基数的子类型)

它按预期工作,因为只有提供预期类型(或其子类型 - 专业化)的对象才有意义。


更新:

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

希望它有帮助;-)

相关内容

  • 没有找到相关文章

最新更新