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'.
答案 0 :(得分:6)
分析仪遵循此处的语言规范。
它只会警告参数表达式的静态类型是否不能赋值给参数的函数类型。
在Dart中,如果任一类型是另一种类型的子类型,则一种类型的表达式可分配给另一种类型的变量。
这不是一种安全的类型检查。它找不到所有可能的错误。另一方面,它也不会禁止一些正确的用途,例如:
Base foo = new Child();
void action(Child c) { ... }
action(foo); // Perfectly correct code at runtime.
其他语言有安全的分配检查,但它们也会阻止一些正确的程序。然后,您必须添加(不安全/运行时检查)强制转换操作符,以告诉编译器您知道该程序是安全的。这是Dart选择宽容并避免大多数演员阵容的权衡。
答案 1 :(得分:1)
让我们试着保持礼貌并毫无偏见地回答这个问题。
我想我理解你的期望,并且在这里我对错误意味着什么的角度:
它正在按预期工作,因为只提供预期类型的对象(或它的子类型 - 特化)才有意义。
<小时/>
再次阅读你的问题后,我意识到你指出编辑器没有找到类型问题。我认为这是因为Dart程序是动态的,因此在运行时之前不会进行某些检查。
希望它有所帮助; - )