Я бы сказал, что это либо ошибка компилятора, либо несоответствие в spec .
Цитата из главы 11.1 Пространство имен пакета (я бы связался напрямую, но документы используютframes):
Пакеты существуют только во время компиляции.Статическое существование пакетов позволяет нам дать им определенные свойства, которые были бы невозможны, если бы ими можно было манипулировать во время выполнения.В частности:
Имена пакетов могут иметь встроенные точки.Полностью определенные ссылки на пакеты могут и должны быть выражены с помощью оператора точки, а не обычного синтаксиса :: :: для квалифицированных имен.
Но поскольку для имени пакета нет значения времени выполнения, пакеты не могут быть псевдонимами или иным образом использоваться ввыражение, которое использует значение времени выполнения.
При обнаружении компилятором в допустимом контексте значение имени пакета становится фиксированным;любая интерпретация во время выполнения больше невозможна.
По этой причине имя пакета всегда затеняет локально определенные имена, независимо от цепочки областей действия, когда это имя пакета используется в левой части оператора точки.
Теперь из вышесказанного я понимаю, что эта строка:
trace(this.view.x, this.view.y);
Не должна интерпретироваться компилятором как ссылка на пакет view
, так как кажетсячтобы противоречить этому - я назову это A):
пакеты не могут быть псевдонимами или иным образом использоваться в выражении, которое использует значение времени выполнения
, потому что this
, если я не ошибаюсь, это значение времени выполнения.
Тогда, если вы используете this
, я думаю, что неопределенность может быть решена как ваш метод получения, но в соответствии с этим параграфом - давайте назовем его B), это не будет:
По этой причине имя пакета всегда затеняет локально определенные имена, независимо от цепочки областей действия, когда это имя пакета используется в левой части оператора точки.
Итак, если вы не используете this
, из спецификации ясно, что view.x
следует интерпретировать как ссылку на определение x
в пакете view
.
Если вы прямо скажете this
, существует противоречие между А) и В), на мой взгляд.Согласно А) не должно быть псевдонимов;но, похоже, псевдоним происходит потому, что слева от оператора точки используется имя пакета.Поэтому я предполагаю, что компилятор не анализирует пакет в контексте, так сказать, просто проверяет, совпадает ли имя слева от оператора точки с именем определенного пакета.