人。所以,我刚才遇到过这个编译错误。由于有一个简单的修复,我当时没有找到任何相关内容,我最终还是放手了。
我只记得它,我现在想知道这是否真的是语言语法的一部分(我非常怀疑)或者它是否是编译器错误。我对此纯粹感到好奇 - 它并没有真正影响开发,但是看看你们中是否有人已经看过这件事会很高兴。
package view {
import flash.display.Sprite;
public class Main extends Sprite {
private var _view:Sprite = new Sprite();
public function Main() {
this.test();
}
private function test():void {
trace(this.view.x, this.view.y);
//1178: Attempted access of inaccessible property x through a reference with static type view:Main.
//1178: Attempted access of inaccessible property y through a reference with static type view:Main.
//Note that I got this due to the package name.
//It runs just fine if I rename the package or getter.
}
public function get view():Sprite {
return this._view;
}
}
}
答案 0 :(得分:3)
我要说这是编译器错误或spec中的不一致。
引用第11.1章包名称空间(我直接链接,但文档使用框架):
包仅在编译时存在。 包的静态存在 允许我们给他们一定的 属性是不可能的 如果他们可以被操纵 运行。特别是:
包名称可能包含嵌入点。 完全合格的包装参考可能 并且必须用点表示 运算符而不是通常:: 限定名称的语法。
但是因为没有运行时值 对于包名,包不能 别名或以其他方式使用 使用运行时值的表达式。
在有效的上下文中遇到时 编译器,包的含义 名称变得固定;任何解释 在运行时不再可能。
因此,包名始终 影子本地定义的名称, 独立于范围链,何时 包名称在左侧使用 点算子的一面。
现在,从上面开始,我收集了这一行:
trace(this.view.x, this.view.y);
编译器不应该将其解释为引用view
包,因为它似乎与此相矛盾 - 我将其称为A):
包不能别名或其他 在使用运行时的表达式中使用 值
因为this
,除非我弄错了,否则是运行时值。
然后,如果你使用this
,我认为可以解决歧义问题,但根据这一段 - 让我们称之为B),它不会:
因此,包名始终 影子本地定义的名称, 独立于范围链, 什么时候使用该包名称 点运算符的左侧。
因此,如果您不使用this
,则从规范中可以清楚地看出view.x
应该被解释为对x
view
定义的引用包。
如果你明确说this
,那么A)和B)之间就会出现矛盾,正如我所看到的那样。根据A)应该没有别名;但似乎正在发生混叠,因为在点运算符的左侧有一个包名。所以我的猜测是编译器没有在上下文中解析包,所以可以说,只检查点运算符左边的任何名称是否与定义的包的名称匹配。