2010-06-13 94 views
2

伙计。所以,我刚才遇到了这个编译错误。由于有一个简单的解决方法,我当时没有找到任何相关的东西,我最终放弃了它。软件包名称与getter和setters冲突吗?

我只记得它,我现在想知道这是否真的是语言语法的一部分(我高度怀疑),还是它是一个编译器错误。我对此很好奇 - 它并没有真正影响开发,但很高兴看到你们中的任何一位是否已经看到了这一点。

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

回答

3

我想说这是一个编译器错误或在spec不一致。

从章节11.1包装命名空间引用(我会直接链接,但该文档使用框架):

套餐只在编译时存在。 包 的静态存在允许我们给它们某些 不可能的属性,如果它们可以在 运行时被操纵,那么它们是不可能的 。特别是:

包名可能有嵌入点。 完全限定的软件包引用可能为 ,必须使用点 运算符而不是通常的:: 语法表示限定名称。

但由于存在对包名称没有运行时值 ,包不能 锯齿或在使用运行时间值的 表达式以其他方式使用。

当在有效上下文中遇到 编译器时,包名 的含义变得固定;运行时的任何解释 都不再可能。

出于这个原因,一个包的名称总是 阴影本地定义的名称, 独立的范围链的,当该 包名称上的点操作者的左手 侧使用。

现在,从上面的,据我了解,这条线:

trace(this.view.x, this.view.y); 

不应该被编译器解释为指的的view包,因为它似乎违背了这一点 - 我“会称之为A):在使用一个运行时 值的表达式使用

包不能被混叠或以其它方式

因为this,除非我错了,是一个运行时间值。

然后,如果你使用this歧义可以解决作为你消气,我想,但根据本段 - 我们称之为B),也不会:

出于这个原因,包名称始终为 阴影本地定义的名称, 独立于作用域链, 当在 点运算符的左侧使用该包名称时。

所以,如果你不使用this,它是从规范明确指出view.x应该被解释为的xview包把定义的参考。

如果你明确地说this,A)和B)之间有矛盾,就像我看到的那样。根据A)应该没有走样;但似乎是别名正在发生,因为在点运算符的左侧有一个包名称。所以我的猜测是编译器不会在上下文中解析包,可以这么说,只是检查点运算符左侧的任何名称是否与定义的包的名称相匹配。

+1

+1。在AS3中,我的经验法则是:不惜任何代价避免在全局标识符(包和类)与范围标识符(变量和属性)之间发生冲突,因为即使上下文非常清晰,编译器也可能会窒息。 – back2dos 2010-06-14 10:17:15

+0

我想我应该填写一份JIRA报告,哈哈。顺便说一下,我注意到'this.view'没有产生任何错误。 :P – mrkishi 2010-06-15 12:44:49