为什么这个ByteArray实验崩溃了AIR

sam*_*old 0 apache-flex air adobe actionscript-3

我正在将数据写入新的ByteArray并将其存储到LocalStore中

var ba:ByteArray = new ByteArray;
ba.writeObject(theobject);

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store
Run Code Online (Sandbox Code Playgroud)

作为一个实验,我试图将前两行变成一行,所以我使用这种语法(我基本上将新的ByteArray放在括号中并立即使用它).

var ba:ByteArray = (new ByteArray).writeObject(theobject) as ByteArray;

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store
Run Code Online (Sandbox Code Playgroud)

但这使我的AIR应用程序在运行时崩溃.如果我回到2行,它工作正常.我意识到这不是什么大问题,但我很好奇为什么这种创造性的语法不起作用.有任何想法吗?

注意:在1行版本中,如果我不添加as ByteArray,它会抱怨我正在尝试使用类型void和ByteArray.

wel*_*rat 8

你自己回答了你的问题:

它抱怨我正在尝试使用ByteArray类型void.

在声明中,将结果分配给writeObject()ByteArray变量,而不是由创建的实例new ByteArray().由于结果类型是void,此赋值是非法的,并导致编译器抛出错误.然后,您已经添加了一个voidByteArray 的手动转换,这显然足以欺骗编译器,但不会阻止运行时的类型转换错误.

简而言之:只有在调用新实例的方法返回时,这种类型的赋值才有效this.顺便说一下,使代码更具可读性的有用方法,也称为方法链的概念.