【发布时间】:2013-01-23 14:48:30
【问题描述】:
运行此代码
var myValue1:int = 2;
switch (myValue1)
{
case -3: trace(myValue1 + " == -3"); break;
case -2: trace(myValue1 + " == -2"); break;
case -1: trace(myValue1 + " == -1"); break;
case 0: trace(myValue1 + " == 0"); break;
case 1: trace(myValue1 + " == 1"); break;
case 2: trace(myValue1 + " == 2"); break;
case 3: trace(myValue1 + " == 3"); break;
default: trace(myValue1 + " is unknown"); break;
}
var myValue2:int = -2;
switch (myValue2)
{
case -3: trace(myValue2 + " == -3"); break;
case -2: trace(myValue2 + " == -2"); break;
case -1: trace(myValue2 + " == -1"); break;
case 0: trace(myValue2 + " == 0"); break;
case 1: trace(myValue2 + " == 1"); break;
case 2: trace(myValue2 + " == 2"); break;
case 3: trace(myValue2 + " == 3"); break;
default: trace(myValue2 + " is unknown"); break;
}
给出这个输出:
2 == 0 -2 未知(在 Flash Builder 4.7.0.349722 中编译,在 Flash 11.5.502.149 上运行。在 Windows 7 SP1、Firefox 18.0.2 中运行)
以下更改都解决了上述问题,并给出了正确的输出:
- 将值类型更改为
Number。 - 删除负数
case语句。 - 将
case语句更改为使用int-variables 而不是 literals...除非这些变量也是const,在这种情况下它会保留坏了!
更改 myValue2 = -1 会得到输出 -1 == -3,这同样是 wtf-ish。
显然这是一个错误,但是……是什么原因造成的?在我不理解的案例陈述中使用int 或负数是否有一些细微差别?我的代码有什么错误吗?或者这仅仅是 Flash Builder 中字节码编译器的问题?
【问题讨论】:
-
发布的代码在 Flash CS5 和 FB4.7 中对我来说可以正常工作。输出:2 == 2 -2 == -2
-
我没有答案,但我经常做这样的事情,而不是一堆 if/else 语句
switch (true) { case someBooleanExpression: break; case someOtherExpression: break; }我认为这种行为的答案在于某种东西被强制/被视为布尔值。但我不能给出明确的答案,我相信其他人会:) -
有趣。仅供参考,我在为 AIR 3.4 构建的 Flash Builder 4.7 中得到了相同的结果(我猜是使用 Flash Player 11.4)。但是,它在为 Flash Player 9、10.3、11.1、11.2、11.3 和 11.4 编译的 Flash Professional CS6 中跟踪
2 == 2和-2 == -2。 -
Flash CS5:
2 == 2and-2 == -2MiniBuilder2 == 2and-2 == -2wonderfl.net2 == 2and-2 == -2 -
要确定是 Flash Player 错误还是编译器错误,请尝试更改每个版本的版本以确定问题的根源。如果编译器被指控,您可以尝试使用 SWFInvestigator 之类的工具来查看输出字节码(以及它有什么问题)。
标签: actionscript-3 flash debugging actionscript flash-builder