我只是不得不审查带有难以发现的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语句获得这种行为吗?
答案 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以获得支持的棉绒的完整列表。