enum Foo {
bar,
baz,
}
仅查看这段代码,我认为它会打印
bar, baz
,然后 barr, bazz
void main() {
final f = Foo.bar;
switch (f) {
case Foo.bar:
case Foo.baz:
print("bar, baz");
}
switch (f) {
case Foo.bar:
if (false) {
return;
}
case Foo.baz:
print("barr, bazz");
}
}
这似乎很明显吧? if (false) 从未被调用,所以它不会返回,它将落入下一个 switch case。
但是没有。它打印
bar, baz
这两个代码块不等价的是什么?这背后的设计选择是什么以及它与其他语言相比如何。或者这只是另一个 Dart bug
更新:
我测试了JS,JS按照我的想法工作。不是日期
let day;
switch (0) {
case 0:
if (false) {
break;
}
case 1:
case 2:
day = "Tuesday"; // prints this
break;
case 3:
day = "Wednesday";
break;
}
一旦您将要执行的代码分配给某些
case
,就无需从switch
中断,例如看以下代码:
int x = 0;
switch (x) {
case 0:
print('0');
case 1:
print('1');
}
输出只是
0
,1
的 case 没有被执行,执行匹配到某些 case 后就中断了 switch。
所以,对于你问题的第二个 switch 语句:
switch (f) {
case Foo.bar:
if (false) { // you have some code to do
return;
}
case Foo.baz:
print("barr, bazz");
}
你已经指定了一些在
Foo.bar
情况下执行的代码,不管它是否是死代码,它仍然是在匹配时执行的代码。
找到匹配,但你没有做任何事情
if(false)
永远不会被执行,那么switch语句就结束了。