包名与 getter 和 setter 冲突?

问题描述 投票:0回答:1

各位。所以,我不久前遇到了这个编译错误..由于有一个简单的修复方法,而且当时我没有找到任何相关的内容,所以我最终放弃了它。

我刚刚想起它,现在我想知道这是否真的是语言语法的一部分(我对此非常怀疑),或者它是否是一个编译器错误。我对此纯粹是好奇——它并不会真正影响开发,但很高兴看看你们中是否有人已经看到了这一点。

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

© www.soinside.com 2019 - 2024. All rights reserved.