包名称与getter和setter冲突?

时间:2010-06-13 19:53:17

标签: actionscript-3 compiler-construction packages

人。所以,我刚才遇到过这个编译错误。由于有一个简单的修复,我当时没有找到任何相关内容,我最终还是放手了。

我只记得它,我现在想知道这是否真的是语言语法的一部分(我非常怀疑)或者它是否是编译器错误。我对此纯粹感到好奇 - 它并没有真正影响开发,但是看看你们中是否有人已经看过这件事会很高兴。

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;
        }
    }
}

1 个答案:

答案 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)应该没有别名;但似乎正在发生混叠,因为在点运算符的左侧有一个包名。所以我的猜测是编译器没有在上下文中解析包,所以可以说,只检查点运算符左边的任何名称是否与定义的包的名称匹配。