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

7.6.5Выражения вызова

Выражение_вызова используется для вызова метода.

выражение_вызова: первичное_выражение ( список_аргументовнеобязательно )

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

  • Основное_выражение имеет тип времени компиляции dynamic.

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

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

Основное_выражение_выражения_вызова должно быть группой методов или значением типа_делегата. Если основное_выражение является группой методов, то выражение_вызова является вызовом метода (§7.6.5.1). Если основное_выражение является значением типа_делегата, то выражение_вызова является вызовом делегата (§7.6.5.3). Если основное_выражение не является ни группой методов, ни значением типа_делегата, то возникает ошибка времени привязки.

Необязательный список_аргументов (§7.5.1) содержит значения или ссылки на переменные для параметров метода.

Результат вычисления выражения_вызова классифицируется следующим образом.

  • Если выражение_вызова вызывает метод или делегат, который возвращает значение типа void, то результат отсутствует. Выражение без класса допускается только в контексте выражения_оператора (§8.6) или в качестве тела лямбда_выражения (§7.15). Иначе возникает ошибка времени привязки.

  • Иначе результатом является значение типа, возвращенного методом или делегатом.

7.6.5.1Вызовы методов

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

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

  • Формируется набор методов-кандидатов для вызова метода. Для каждого метода F, связанного с группой методов M

  • Если F является неуниверсальным методом, то F является кандидатом, когда:

  • у M нет списка аргументов типа и

  • F является применимым в соответствии со списком A (§7.5.3.1).

  • Если F является универсальным методом, а у M нет списка аргументов типа, то F является кандидатом, когда:

  • успешно завершается вывод типа (§7.5.2), предоставляющий список аргументов типа для вызова, и

  • после замены выведенных аргументов типа на соответствующие параметры типа для метода все сформированные типы в списке параметров F соответствуют своим ограничениям (§4.4.4), а список параметров F применим в соответствии со списком A (§7.5.3.1).

  • Если F является универсальным методом, а M включает список аргументов типа, то F является кандидатом, когда:

  • число параметров типа для метода F равно числу аргументов, предоставленному в списке аргументов типа, и

  • после замены аргументов типа на соответствующие параметры типа для метода все сформированные типы в списке параметров F соответствуют своим ограничениям (§4.4.4), а список параметров F применим в соответствии со списком A (§7.5.3.1).

  • Набор методов-кандидатов сокращается, и содержи только методы из старших производных типов: для каждого метода C.F в наборе, где C - тип, в котором объявляется метод F, все методы, объявленные в базовом типе С, удаляются из набора. Более того, если C является типом класса, отличным от object, то все методы, объявленные в типе интерфейса из набора удаляются. (Последнее правило применяется только, когда группа методов является результатом поиска члена по параметру типа при наличии действительного базового класса, отличного от object, и непустого действительного набора интерфейсов.)

  • Если результирующий набор методов-кандидатов пуст, то дальнейшая обработка вместе со следующими этапами не выполняется, а вместо этого предпринимается попытка обработать вызов в виде вызова метода расширения (§7.6.5.2). Если такая обработка не удается, то применимых методов не существует и возникает ошибка времени привязки.

  • Лучший метод из набора методов-кандидатов определяется с помощью правил разрешения перегрузки из раздела §7.5.3. Если определить один лучший метод нельзя, то вызов метода является неоднозначным и возникает ошибка времени привязки. При проведении разрешения перегрузки параметры универсального метода учитываются после замены аргументов типа (предоставленных или выведенных) на соответствующие параметры типа для метода.

  • Выполняется последняя проверка выбранного лучшего метода.

  • Метод проверяется в контексте группы методов: если наиболее подходящий метод является статическим, группа методов, скорее всего, получилась из простого_имени или доступа_к_члену через тип. Если лучший метод является методом экземпляра, то группа методов должна формироваться на основании простого_имени, доступа_к_члену через переменную или значение или на основании доступа_base. Если не выполняется ни одно из этих требований, то возникает ошибка времени привязки.

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

После выбора и проверки метода в соответствии с указанными этапами на этапе привязки обрабатывается фактический вызов времени выполнения в соответствии с правилами вызова функций-членов из раздела §7.5.4.

Понятным результатом применения правил разрешения, описанных выше, является следующее: Чтобы найти конкретный метод, вызванный при вызове метода, следует начать с типа, указанного в вызове метода, и пройти по цепочке наследования пока не будет найдено объявление последнего применимого, доступного, неперегруженного метода. Затем выполняется вывод типа и разрешение перегрузки для набора применимых, доступных и неперегруженных методов, объявленных в этом типе, и вызывается выбранный таким образом метод. Если метод не найден, предпринимается попытка обработать вызов в виде вызова метода расширения.

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