【发布时间】:2019-06-14 17:55:33
【问题描述】:
我刚刚检查了 dart 代码,发现了一个难以发现的错误。它看起来像这样:
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 语句获得这种行为吗?
【问题讨论】:
-
我可以建议将分析器添加到您的构建/集成/验证服务器中,这样您的一些分析器规则就会出错。在我的项目中,我实际上将所有 linter 警告都设为错误,因此如果分析器出现任何警告,我的提交将被标记为“失败”。
标签: dart