飞镖:强制执行强类型比较

时间:2019-06-14 17:55:33

标签: dart

我只是不得不审查带有难以发现的bug的飞镖代码。看起来像这样:

enum Day{
  Mon,
  Tue,
}

void main(){
  Day today = Day.Mon;

  if(today == 0){
    print("it's Monday");
  }
}

错误是dart中的枚举不是整数。 Day与任何整数之间的比较将始终返回false。

但是,对于Java开发人员来说,这看起来像是编写错误但有效的代码。在Java中,枚举基本上是整数。我认为Go中也是一样。

Android Studio意识到了这个问题,并用灰色强调了代码。如果您将鼠标悬停在那条线上,它会告诉您:

  

使用不相关类型的引用调用平等运算符==

视觉标记很容易忽略,如果您使用Github等代码进行代码审查,您可能根本看不到。

我的问题是:我可以以某种方式在比较中强制类型安全吗? 理想情况下,我想指定一个捕获这一点的编译器标志。 例如,以下Rust代码不会编译:

fn main() {
    println!("{}", "Hello, world!" == 0);
}
  

错误[E0277]:无法将&str{integer}

进行比较

switch语句中,编译器强制执行类型安全,这不会编译:

switch(today){
  case 1:
  //...
}

我也可以针对if语句获得这种行为吗?

1 个答案:

答案 0 :(得分:1)

编辑(或创建)您的analysis_options.yaml文件并为unrelated_type_equality_checks添加皮棉并将其视为错误:

linter:
  rules:
    - unrelated_type_equality_checks

analyzer:
  errors:
    unrelated_type_equality_checks: error

启用该功能后,对您的代码运行dartanalyzer会生成:

error • Equality operator `==` invocation with references of unrelated types at foo.dart:9:6 • unrelated_type_equality_checks

有关配置analysis_options.yaml的更多信息,请参见Customizing static analysis的文档。您还可以查看Supported Lint Rules以获得支持的棉绒的完整列表。