2010-06-13 39 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