各位。所以,我不久前遇到了这个编译错误..由于有一个简单的修复方法,而且当时我没有找到任何相关的内容,所以我最终放弃了它。
我刚刚想起它,现在我想知道这是否真的是语言语法的一部分(我对此非常怀疑),或者它是否是一个编译器错误。我对此纯粹是好奇——它并不会真正影响开发,但很高兴看看你们中是否有人已经看到了这一点。
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;
}
}
}
我想说这要么是编译器错误,要么是spec中的不一致。
引用第 11.1 章包命名空间(我会直接链接,但文档使用框架):
包仅在编译时存在。 包的静态存在 允许我们给他们一定的 不可能的属性 如果它们可以被操纵 运行时。特别是:
包名称可能嵌入点。 完全合格的包参考可能 并且必须使用点来表达 运算符而不是通常的 :: 限定名称的语法。
但是因为没有运行时价值 对于包名称,包不能是 别名或以其他方式使用 使用运行时值的表达式。
当在有效的上下文中遇到 编译器、包的含义 名称变得固定;任何解释 在运行时不再可能。
因此,包名总是 阴影本地定义的名称, 独立于作用域链,当 该包名称用在左侧 点运算符的手侧。
现在,从上面的内容,我推断出这一行:
trace(this.view.x, this.view.y);
编译器不应将其解释为引用
view
包,因为它似乎与这一点相矛盾 - 我将其称为 A):
包不能使用别名或其他方式 在使用运行时的表达式中使用 价值
因为
this
,除非我弄错了,是一个运行时值。
然后,如果你使用
this
作为你的吸气剂,歧义可以得到解决,我认为,但根据这一段——让我们称之为B),它不会:
因此,包名总是 阴影本地定义的名称, 独立于作用域链, 当该包名称用于 点运算符的左侧。
因此,如果您不使用
this
,从规范中可以清楚地看出,view.x
应解释为对 x
包中 view
定义的引用。
如果你明确地说
this
,那么在我看来,A)和B)之间存在矛盾。根据A)不应存在混叠;但似乎正在发生别名,因为点运算符的左侧使用了一个包名称。所以我的猜测是编译器没有在上下文中解析包,可以这么说,只是检查点运算符左侧的任何名称是否与定义的包的名称匹配。