Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

9.5Члены пространства имен

Объявление_члена_пространства_имен является либо объявлением_пространства_имен (§9.2), либо объявлением_типа (§9.6).

объявления_членов_пространства_имен: объявление_члена_пространства_имен объявления_членов_пространства_имен объявление_члена_пространства_имен

объявление_члена_пространства_имен: объявление_пространства_имен объявление_типа

В единице компиляции или в теле пространства имен могут содержаться объявления_членов_пространства_имен, и эти объявления размещают новые члены в базовой области объявлений содержащей единицы компиляции или тела пространства имен.

9.6Объявления типов

Объявление_типа является объявлением_класса (§10.1), объявлением_структуры (§11.1), объявлением_интерфейса (§13.1), объявлением_перечисляемого_типа (§14.1) или объявлением_делегата (§15.1).

объявление_типа: объявление_класса объявление_структуры объявление_интерфейса объявление_перечисляемого_типа объявление_делегата

Объявление_типа может быть объявлением верхнего уровня в единице компиляции или объявлением члена внутри пространства имен, класса или структуры.

Если объявление типа для типа T является объявлением верхнего уровня в единице компиляции, полное имя вновь объявленного типа просто T. Если объявление типа для типа T находится внутри пространства имен, класса или структуры, то полное имя вновь объявленного типа N.T, где N является полным именем содержащего пространства имен, класса или структуры.

Тип, объявленный внутри класса или структуры, называется вложенным типом (§10.3.8).

Разрешенные модификаторы доступа и доступ по умолчанию для объявления типа зависит от контекста, в котором имеет место объявление (§3.5.1):

  • типы, объявленные в единицах компиляции или в пространствах имен, могут иметь доступ public или internal. Доступ по умолчанию internal;

  • типы, объявленные в классах, могут иметь доступ public, protected internal, protected, internal или private. Доступ по умолчанию private;

  • типы, объявленные в структурах, могут иметь доступ public, internal или private. Доступ по умолчанию private.

9.7Квалификаторы псевдонима пространства имен

Квалификатор псевдонима пространства имен :: дает возможность гарантировать, что на поиск имени типа не будет влиять введение новых типов и членов. Квалификатор псевдонима пространства имен всегда стоит между двумя идентификаторами, которые называют левым и правым. В отличие от регулярного квалификатора ., поиск левого идентификатора квалификатора :: выполняется только как поиск псевдонима extern или using.

Уточненный_член_псевдонима определяется следующим образом:

уточненный_член_псевдонима: идентификатор :: идентификатор список_аргументов_типанеоб

Уточненный_член_псевдонима можно использовать как имя_пространства_имен_или_типа (§3.8) или как левый операнд доступа_к_члену (§7.6.4).

Уточненный_член_псевдонима может принимать одну из двух форм:

  • N::I<A1, ..., AK>, где N и I представляют идентификаторы, а <A1, ..., AK> — список аргументов типа. (K всегда по меньшей мере единица);

  • N::I, где N и I представляют идентификаторы (в этом случае K считается равным нулю).

При использовании этой нотации значение уточненного_члена_псевдонима определяется следующим образом:

  • если N является идентификатором global, то поиск I ведется в глобальном пространстве имен:

  • если в глобальном пространстве имен содержится пространство имен с именем I, а K равно нулю, то уточненный_член_псевдонима ссылается на это пространство имен;

  • иначе, если в глобальном пространстве имен содержится неуниверсальный тип с именем I, а K равно нулю, то уточненный_член_псевдонима ссылается на этот тип;

  • иначе, если в глобальном пространстве имен содержится тип с именем I, у которого имеется K параметров типа, то уточненный_член_псевдонима ссылается на этот тип, сформированный с данными аргументами типа;

  • иначе уточненный_член_псевдонима не определен и выдается ошибка времени компиляции.

  • иначе, начиная с объявления пространства имен (§9.2), непосредственно содержащего уточненный_член_псевдонима (если имеется), далее для каждого вмещающего объявления пространства имен (если имеются), и заканчивая единицей компиляции, содержащей уточненный_член_псевдонима, оцениваются следующие шаги, пока не будет обнаружена сущность:

  • если в объявлении пространства имен или в единице компиляции содержится директива_using_alias, связывающая N с типом, то уточненный_член_псевдонима не определен и выдается ошибка времени компиляции;

  • иначе, если в объявлении пространства имен или в единице компиляции содержится директива_extern_alias или директива_using_alias, связывающая N с пространством имен, то:

  • если в пространстве имен, связанном с N, содержится пространство имен с именем I, а K равно нулю, то уточненный_член_псевдонима ссылается на это пространство имен;

  • иначе, если в пространстве имен, связанном с N, содержится неуниверсальный тип с именем I, а K равно нулю, то уточненный_член_псевдонима ссылается на этот тип;

  • иначе, если в пространстве имен, связанном с N, содержится тип с именем I, у которого имеется K параметров типа, то уточненный_член_псевдонима ссылается на этот тип, сформированный с данными аргументами типа;

  • иначе уточненный_член_псевдонима не определен и выдается ошибка времени компиляции.

  • иначе уточненный_член_псевдонима не определен и выдается ошибка времени компиляции.

Обратите внимание, что использование квалификатора псевдонима пространства имен с псевдонимом, ссылающимся на тип, вызывает ошибку времени компиляции. Кроме того, если N является идентификатором global, то поиск выполняется в глобальном пространстве имен, даже если существует псевдоним using, связывающий global с типом или пространством имен.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]