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

7.6.8Доступ base

Доступ_base состоит из зарезервированного слова base, за которым следует либо лексема «.» с идентификатором, либо список_аргументов, заключенный в квадратные скобки:

доступ_base: base . идентификатор base [ список_аргументов ]

Доступ_base используется для доступа к членам базового класса, скрытым членами с такими же именами в текущем классе или структуре. Доступ_base допустим только в блоке конструктора экземпляра, метода экземпляра или метода доступа к экземпляру. Когда вызов base.I происходит в классе или структуре, I должно обозначать член базового класса для данного класса или структуры. Так же, когда вызов base[E] оказывается в классе, в базовом классе должен существовать применимый индексатор.

Во время привязки выражения доступа_base в виде base.I и base[E] вычисляются точно так же, как если бы они записывались в виде ((B)this).I и ((B)this)[E], где B является базовым классом для класса или структуры, в которой находится эта конструкция. Таким образом, base.I и base[E] соответствуют выражениям this.I и this[E] за исключением того, что this рассматривается как экземпляр базового класса.

Когда в доступе_base оказывается ссылка на виртуальную функцию-член (метод, свойство или индексатор), способ определения вызываемой во время выполнения функции-члена (§7.5.4) меняется. Вызываемая функция-член определяется путем поиска наиболее производной реализации (§10.6.3) функции-члена в соответствии с B (вместо сравнения с типом this во время выполнения, что является обычной процедурой при доступе, отличном от base). Таким образом, внутри виртуальной или перегруженной функции-члена доступ_base можно использовать для вызова наследованной реализации функции-члена. Если функция-член, на которую ссылается доступ_base, является абстрактной, то возникает ошибка времени привязки.

7.6.9Постфиксные операторы инкремента и декремента

выражение_после_инкремента: первичное_выражение ++

выражение_после_декремента: первичное_выражение --

Операнд постфиксного оператора инкремента или декремента должен быть выражением, которое классифицируется как переменная, доступ к свойству или доступ к индексатору. Результатом операции является значение того же типа, что и операнд.

Если первичное_выражение имеет тип времени компиляции dynamic, то оператор динамически привязан (§7.2.2), выражение_после_инкремента или выражение_после_декремента имеет тип времени компиляции dynamic, а также во время выполнения применяются следующие правила, используя тип времени выполнения первичного_выражения.

Если операндом постфиксного оператора инкремента или декремента является свойство или доступ к индексатору, то у свойства и индексатора должны быть оба метода доступа get и set. В противном случае возникает ошибка времени привязки.

Для выбора конкретной реализации оператора используется разрешение перегрузки унарных операторов (§7.3.3). Стандартные операторы ++ и -- применимы к следующим типам: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal и любым типам перечисления. Стандартный оператор ++ возвращает значение, полученное добавлением 1 к операнду, а стандартный оператор -- возвращает значение, полученное вычитанием 1 из операнда. В контексте checked если результат такого сложения или вычитания выходит за пределы допустимого диапазона для типа результата и результат имеет целый тип или тип перечисления, возникает исключение System.OverflowException.

Во время выполнения обработка постфиксных операций инкремента или декремента в виде x++ или x-- включает следующие этапы.

  • Если x классифицируется как переменная, то:

  • x вычисляется для создания переменной.

  • Значение x сохраняется.

  • Вызывается выбранный оператор с сохраненным значением x в качестве аргумента.

  • Значение, возвращенное оператором, сохраняется в расположении, предоставленном при вычислении x.

  • Сохраненное значение x становится результатом операции.

  • Если x классифицируется как свойство или доступ к индексатору, то:

  • Вычисляются выражение экземпляра (если x не имеет тип static) и список аргументов (если x является доступом к экземпляру), связанные с x, и полученные результаты используются при последующих вызовах методов доступа get и set.

  • Вызывается метод доступа get для x, а возвращенное значение сохраняется.

  • Вызывается выбранный оператор с сохраненным значением x в качестве аргумента.

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

  • Сохраненное значение x становится результатом операции.

Операторы ++ и -- также могут использоваться в препозиции (§7.7.5). Обычно результатом операторов x++ и x-- является значение x до операции, тогда как результатом ++x и --x является значение x после операции. В обоих случаях сама переменная x имеет одинаковое значение после операции.

Реализацию оператора ++ или -- можно вызывать в префиксной и постфиксной форме. Для двух этих форм нельзя создать разные реализации операторов.

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