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

3.8Имена пространств имен и типов

Некоторые контексты в программе на C# требуют указания имени_пространства_имен или имени типа.

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

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

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

Имя_пространства_имен — это имя_пространства_имен_или_типа, ссылающееся на пространства имен. Согласно описанию ниже следующее разрешение имени_пространства_имен_или_типа от имени_пространства_имен должно ссылаться на пространства имен, в противном случае возникает ошибка времени компилирования. Аргументы типов (§4.4.1) не могут быть представлены в имени_пространства_имен (только типы с аргументами типа).

Имя_типа — это имя_пространства_имен_или_типа, ссылающееся на тип. Согласно описанию ниже следующее разрешение имени_пространства_имен_или_типа от имени_типа должно ссылаться на тип, в противном случае возникает ошибка времени компилирования.

Если имя_пространства_имен_или_типа является членом квалифицированного псевдонима, его значение соответствует описанию в разделе §9.7. В противном случае имя_пространства_имен_или_типа имеет одну из следующих четырех форм.

  • I

  • I<A1, ..., AK>

  • N.I

  • N.I<A1, ..., AK>

где I — отдельный идентификатор, N — имя_пространства_имени_или_типа и <A1, ..., AK> — дополнительный список_аргументов_типа. Когда список_аргументов_типа не указан, считается, что K равно нулю.

Значение имени_пространства_имен_или_типа определяется следующим образом.

  • Имя_пространства_имен_или_типа имеет одну из форм I или форму I<A1, ..., AK>:

  • Если K имеет нулевое значение, имя_пространства_имен_или_типа появляется в универсальном методе объявления (§10.6), а также если это объявление включает параметр типа (§10.1.3) с именем I, имя_пространства_имен_или_типа ссылается на данный параметр типа.

  • В противном случае, если имя_пространства_имен_или_типа появляется в объявлении типа, то для каждого типа экземпляра T (§10.3.1), начиная с типа экземпляра данного объявления типа и далее для типов экземпляра каждого включающего класса или объявления структуры (при наличии):

  • Если K имеет нулевое значение, а объявление T включает параметр типа с именем I, то имя_пространства_имен_или_типа ссылается на данный параметр типа.

  • В противном случае, если имя_пространства_имен_или_типа появляется в теле объявления типа, а T или любой его базовый тип содержит вложенный доступный тип с именем I и K параметров типа, то имя_пространства_имен_или_типа ссылается на этот тип, сформированный с данными аргументами типа. При наличии более одного типа структуры выбирается тип, объявленный в рамках большего производного типа. Обратите внимание, что члены, не являющиеся типами (константы, поля, методы, свойства, индексаторы, операторы, экземпляры, конструкторы, деструкторы и статические конструкторы), и члены типа с различным числом параметров типа игнорируются при определении значения имени_пространства_имен_или_типа.

  • Если предыдущие шаги не были успешно выполнены, для каждого пространства имен N, начиная с пространства имен, содержащего имя_пространства_имен_или_типа, далее для каждого включающего пространства имен (при наличии), и заканчивая глобальным пространством имен, вычисляются следующие шаги до нахождения сущности.

  • K имеет нулевое значение, а I является именем пространства имен N.

  • Если местоположение, содержащее имя_пространства_имен_или_типа, заключено объявлением пространства имен для N, а объявление пространства имен содержит директиву_внешнего_псевдонима или директиву_использования_псевдонима, связывающие имя I с пространством имен или типом, то имя_пространства_имен_или_типа неоднозначно, поэтому возникает ошибка времени компилирования.

  • В противном случае имя_пространства_имен_или_типа ссылается на пространство имен с именем I в N.

  • Иначе, если N содержит доступный тип с именем I и K параметрами типа, то:

  • Если K имеет нулевое значение и местоположение, содержащее имя_пространства_имен_или_типа, заключено объявлением пространства имен для N, а объявление пространства имен содержит директиву_внешнего_псевдонима или директиву_использования_псевдонима, связывающие имя I с пространством имен или типом, то имя_пространства_имен_или_типа неоднозначно, поэтому возникает ошибка времени компилирования.

  • В противном случае, имя_пространства_имен_или_типа ссылается на тип, сконструированный с заданными аргументами типа.

  • Наоборот, местоположение, содержащее имя_пространства_имен_или_типа, заключено объявлением пространства имен для N.

  • Если K имеет нулевое значение и объявление пространства имен содержит директиву_внешнего_псевдонима или директиву_использования_псевдонима, связывающих имя I с импортированным пространством имен или типом, то имя_пространства_имен_или_типа ссылается на данное пространство имен или тип.

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

  • В противном случае, если пространства имен, импортированные путем директив_использования_пространств_имен, объявления пространства имен содержат более одного типа с именем I и параметрами типа K, то имя_пространства_имен_или_типа неоднозначно, поэтому возникает ошибка времени компилирования.

  • В противном случае имя_пространства_имен_или_типа не определено, поэтому возникает ошибка времени компилирования.

  • Наоборот, имя_пространства_имен_или_типа имеет одну из форм N.I или форму N.I<A1, ..., AK>. N впервые разрешается в качестве имени_пространства_имен_или_типа. Если разрешение N неуспешно, возникает ошибка времени компилирования. В противном случае N.I или N.I<A1, ..., AK> разрешаются следующим образом.

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

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

  • В противном случае, если N ссылается на тип класса (возможно, сформированного) или тип структуры, и если N или любой его базовый класс содержит вложенный доступный тип с именем I и K параметров типа, то имя_пространства_имен_или_типа ссылается на данный тип, сформированный с заданными аргументами типа. При наличии более одного типа структуры выбирается тип, объявленный в рамках более производного типа. Следует отметить, что если значение N.I определяется как часть разрешения спецификации базового класса N, прямой базовый класс N считается объектом (§10.1.4.1).

  • В противном случае N.I является недействительным именем_пространства_имен_или_типа, поэтому возникает ошибка времени компилирования.

Ссылка имени_пространства_имен_или_типа на статический класс (§10.1.1.3) допускается только в следующих случаях.

  • Имя_пространства_имен_или_типа = T в имени_пространства_имен_или_типа формы T.I

  • Имя_пространства_имен_или_типа = T в выражении_typeof (§7.5.11) формы typeof(T).

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