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

7.5.5.1Вызов в упакованных экземплярах

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

  • Когда функция-член является перегрузкой метода, унаследованного от типа object, и вызывается через выражение экземпляра типа object.

  • Когда функция-член является реализацией функции-члена экземпляра и вызывается через выражение экземпляра типа_интерфейса.

  • Когда функция-член вызывается через делегат.

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

7.6Первичные выражения

Первичные выражения включают самые простые формы выражений.

первичное_выражение: первичное_выражение_создания_не_массива выражение_создания_массива

первичное_выражение_создания_не_массива: литерал простое_имя выражение_в_скобках доступ_к_члену выражение_вызова метод_доступа_к_элементу доступ_через_this доступ_к_базовому_объекту выражение_после_инкремента выражение_после_декремента выражение_создания_объекта выражение_создания_делегата выражение_создания_анонимного_объекта выражение_typeof выражение_checked выражение_unchecked выражение_значения_по_умолчанию выражение_анонимного_метода

Первичные выражения разделяются на выражения_создания_массива и первичные_выражения_создания_не_массива Такое выделение выражений создания массива, вместо рассмотрения их вместе с другими простыми видами выражений, позволяет в грамматике запретить потенциально неоднозначный код, ср.:

object o = new int[3][1];

который в противном случае интерпретировался бы как

object o = (new int[3])[1];

7.6.1Литералы

Первичное_выражение, состоящее из литерала (§2.4.4), считается значением.

7.6.2Простые имена

Просто_имя состоит из идентификатора, за которым может следовать список аргументов типа:

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

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

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

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

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

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

  • Иначе, если при поиске члена I (§7.4) в T с K аргументами типа получены результаты:

  • Если T имеет тип экземпляра непосредственного включающего класса или структуры и при поиске находится один или несколько методов, то результатом является группа методов со связанным выражением экземпляра this. Если указан список аргументов типа, он используется при вызове универсального метода (§7.6.5.1).

  • Иначе, если T имеет тип экземпляра непосредственного включающего класса или структуры и при поиске находится член экземпляра и если внутри блока конструктора экземпляра, метода экземпляра или метода доступа к экземпляру находится ссылка, то результатом является метод доступа к члену (§7.6.4) в виде this.I. Это происходит, только когда K равно нулю.

  • Иначе результатом является метод доступа к члену (§7.6.4) в виде T.I или T.I<A1, ..., AK>. AK>. В таком случае если простое_имя будет относиться к члену экземпляра, это будет вызывать ошибку времени компиляции.

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

  • Если K равно нулю и I является именем пространства имен в N, то:

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

  • Иначе простое_имя относится к пространству имен I в N.

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

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

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

  • Иначе, если местонахождение простого_имени включено в объявление пространства имен для N, то:

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

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

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

Обратите внимание, что этот этап полностью повторяет соответствующий этап в обработке имени_пространства_имен_или_типа (§3.8).

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

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