-5

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'.
4

2 回答 2

6

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

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

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

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

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

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

于 2014-03-02T20:05:09.957 回答
1

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

我想我理解你的期望,在这里我对错误意味着什么的看法:

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

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


更新:

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

希望能帮助到你 ;-)

于 2014-03-02T14:25:25.230 回答