Операция вызова используется для вызова метода.
invocation-expression:
primary-expression [< type-listopt >] ( argument-listopt )
Первичное выражение в операции вызова должно быть группой методов или значением делегата. Если первичное выражение представляет собой группу методов, то операция вызова производит вызов метода. Если первичное выражение представляет собой значение делегата, то операция вызова производит вызов делегата. В противном случае возникает ошибка компиляции.
Опциональный список аргументов предоставляет значения или ссылки на переменные для передачи в качестве значений параметров метода. Список аргументов указывается в круглых скобках. Если аргументы отсутствуют, то указываются пустые скобки.
В языке реализована поддержка вызова универсальных методов. Опциональный список параметров-типов должен включать в себя все типы, предусмотренные для использования в вызываемом методе. Список параметров-типов указывается в угловых скобках.
Примечание: В текущей реализации доступен вызов универсальных методов, реализованных с помощью других языков программирования и содержащихся в импортируемых библиотеках. Разработка универсальных методов с помощью языка Fore.NET не поддерживается.
Результат операции вызова классифицируется следующим образом:
если выражение производит вызов метода или делегата, не имеющего возвращаемого значения, то результатом выражения является пустое выражение. Данное выражение не может выступать в качестве операнда для других операций и его использование допустимо только в контексте оператора вызова.
в противном случае результатом выражения является значение с типом возвращаемым методом или делегатом.
В случае вызова метода первичное выражение в операции вызова должно представлять собой группу методов. Группа методов идентифицирует один метод или множество перегруженных методов из которых будет выбран конкретный метод для его вызова. В последнем случае определение конкретного метода для вызова основано на контексте, представляемом типами аргументов в перечне аргументов.
Обработка операции вызова метода в форме M(A), где M – группа методов, а A – опциональный перечень аргументов, во время компиляции производится следующим образом:
строится множество методов-кандидатов. Начиная с множества методов, ассоциированных с M, которые ранее были получены в процессе поиска члена, производится редукция этого множества до тех методов, которые являются подходящими с учетом указанного перечня аргументов. Редукция множества производится путем применения следующих правил для каждого метода T.N, где T- это тип в котором определен метод N:
если N не является подходящим к A, то N исключается из множества;
если N является подходящим к A, то все методы определенные в базовом типе для T исключаются их множества;
если результирующее множество методов-кандидатов является пустым, то не существует подходящего метода и возникает ошибка компиляции.
лучший метод из множества методов-кандидатов определяется путем использования правил разрешения перегруженных имен. Если не может быть идентифицирован единственный подходящий метод, то операция вызова метода является неоднозначной и возникает ошибка компиляции.
В случае вызова делегата первичное выражение в операции вызова должно представлять собой значение типа-делегата. Более того, рассматривая тип-делегат как функциональный член с тем же списком параметров, что и у типа-делегата, требуется чтобы тип-делегат был подходящим по отношению к перечню аргументов, указанных в операции вызова.
Обработка операции вызова метода в форме D(A), где D – первичное выражение типа-делегата, а A – опциональный перечень аргументов, во время выполнения производится следующим образом:
производится вычисление D. Если при этом возникает исключительная ситуация, то обработка вызова прекращается;
производится проверка значения D. Если оно равно Null, то возбуждается исключительная ситуация класса System.NullReferenceException и обработка вызова прекращается;
в противном случае D является ссылкой на экземпляр делегата. Производятся вызовы функциональных членов для каждого элемента списка вызовов делегата.
См. также: