Dart 子类型和方法参数

Dart subtyping and method arguments

我正在尝试了解 Dart 类型系统的工作原理。 这是一个片段:

class Base {}

class Derived extends Base {}

void f(Derived x) {}

void main() {
  Base x = Base();
  f(x);
}

至少在 https://dartpad.dartlang.org/ 这会编译并给出以下运行时错误:

Uncaught exception:
TypeError: Instance of 'Base': type 'Base' is not a subtype of type 'Derived'

显然,接受有序集的方法不能只接受一般集。

这不应该是可以在编译时捕获的东西吗?是否有一些编译标志可以设置以便编译器可以检测到此类错误?

更新: 这是一个更简单的例子:

void main() {
  num a = 2.5;
  int b = a;
}

这里有一个关于此行为的未决问题: https://github.com/dart-lang/sdk/issues/30052

如果您希望分析器为此出错,您可以在项目的根目录中创建一个名为 analysis_options.yaml 的文件,其中包含以下内容:

analyzer:
  strong-mode:
    implicit-casts: false