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

7.6.5.3Вызовы делегатов

Для вызова метода основное_выражение для выражения_вызова должно быть значением типа_делегата. Кроме того, учитывая, что тип_делегата должен быть функцией-членом с таким же списком параметров, что и тип_делегата, он должен быть применим (§7.5.3.1) в соответствии со списком_аргументов_выражения_вызова.

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

  • Вычисляется D. Если при этом вычислении возникает исключение, дальнейшие этапы не выполняются.

  • Выполняется проверка допустимости значения D. Если D имеет значение null, вызывается исключение System.NullReferenceException и дальнейшие этапы не выполняются.

  • Иначе D является ссылкой на экземпляр делегата. Вызовы функций-членов (§7.5.4) выполняются для каждой вызываемой сущности в списке вызова делегата. Для вызываемых сущностей, состоящих из экземпляра и метода экземпляра, вызываемый экземпляр является экземпляром, содержащимся в вызываемой сущности.

7.6.6Метод доступа к элементу

Доступ_к_элементу состоит из первичного_выражения_создания_не_массива, за которым следует лексема «[» и список_аргументов, за которым следует лексема «]». Список_аргументов содержит один или несколько аргументов, разделенных запятыми.

доступ_к_элементу: первичное_выражение_создания_не_массива [ список_аргументов ]

Список_аргументов метода_доступа_к_элементу не должен содержать аргументы ref или out.

Доступ_к_элементу динамически привязан, (§7.2.2), если верно по меньшей мере одно из следующих утверждений:

  • первичное_выражение_создания_не_массива имеет тип времени компиляции dynamic;

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

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

Если основное_выражение_отличное_от_создания_массива, для метода_доступа_к_элементу является значением с типом_массива, то метод_доступа_к_элементу является методом доступа к массиву (§7.6.6.1). Иначе основное_выражение_отличное_от_создания_массива, должно быть переменной или значением типа класса, структуры или интерфейса с одним или несколькими членами индексатора, и в таком случае метод_доступа_к_элементу является методом доступа к индексатору (§7.6.6.2).

7.6.6.1Доступ к массиву

При доступе к массиву основное_выражение_отличное_от_создания_массива, для метода_доступа_к_элементу должно быть значением типа_массива. В дальнейшем список_аргументов метода доступа к массиву не должен содержать именованные аргументы. Число выражений в списке_аргументов должно быть идентичным рангу типа_массива, а каждое выражение должно иметь тип int, uint, long, ulong или должно подразумевать возможность преобразования в один или несколько этих типов.

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

Обработка времени выполнения доступа к массиву в виде P[A], где P является первичным_выражением_создания_не_массива с типом_массива, а A является списком_аргументов, включает следующие этапы.

  • Вычисляется P. Если при этом вычислении возникает исключение, дальнейшие этапы не выполняются.

  • Вычисляются выражения индекса в списке_аргументов по порядку слева направо. После вычисления всех выражений индекса выполняется неявное преобразование (§6.1) в один из следующих типов: int, uint, long, ulong. Выбирается первый тип из этого списка, для которого существует неявное преобразование. Например, если выражение индекса имеет тип short, то выполняет неявное преобразование в тип int, поскольку возможны неявные преобразования из short в int и из short в long. Если при вычислении выражения индекса или последующем неявном преобразовании возникает исключение, то следующие выражения индекса не вычисляются и дальнейшие этапы не выполняются.

  • Выполняется проверка допустимости значения P. Если P имеет значение null, вызывается исключение System.NullReferenceException и дальнейшие этапы не выполняются.

  • Значение каждого выражения в списке_аргументов проверяется на соответствие фактическим границам каждого измерения экземпляра массива, на который ссылается P. Если одно или несколько значений выходят за пределы допустимого диапазона, вызывается исключение System.IndexOutOfRangeException и дальнейшие этапы не выполняются.

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

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