20

运行此代码

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-变量而不是文字......除非这些变量也是const,在这种情况下它会被破坏!

改变myValue2 = -1给出了输出-1 == -3,这同样是 wtf-ish。


显然这是一个错误,但是......是什么原因造成的?int 在我不理解的案例陈述中使用或负数是否有一些微妙的细微差别?我的代码有什么错误吗?或者这仅仅是 Flash Builder 中字节码编译器的问题?

4

3 回答 3

1

我不认为你会找到这个问题的具体答案。我可以提供的是对 AS3 编译器错误的确认。我花了很长时间试图解决类似的“神奇”错误,结果却一无所获。一个这样的例子是 For 和 While 循环无缘无故地跳过数组中的第一项或最后一项,而 Foreach 循环工作得很好。

对我来说,最合理的原因是内存管理中的错误。这也可能与硬件有关,因为在我或我的同事工作的某些机器上发生此类事情的频率更高。我认为满足一些“不可见”条件,例如执行操作的顺序(您可以尝试在 var 声明和开关之间放置一些虚拟代码,或者可能多次分配 var 值,只是为了“慢跑记忆” ) 与容易出错的编译器相结合会弄乱内存寻址,并且您的开关认为它与两个整数有关,而实际上它从内存中获得了不同的值。

于 2013-02-13T14:22:47.163 回答
1

您可以通过将原始值转换为 String 并将您的案例转换为 String 值来强制编译器进行操作。

switch( String(value) )
{
   case "-3": /*do something*/; break;
   case "-2": /*do something*/; break;
   case "-1": /*do something*/; break;
   case  "0": /*do something*/; break;
   case  "1": /*do something*/; break;
   case  "2": /*do something*/; break;
   case  "3": /*do something*/; break;
   default: break;
}
于 2013-02-14T22:25:18.137 回答
1

这只是 Flash Builder 中字节码编译器的一个问题。

显然,您的语法很好;可追溯到 2005 年的编译器实际上存在数百个已知问题,这些问题仍然存在或未解决。

于 2013-02-17T21:52:33.047 回答