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

7.5.2.13Вывод типа при преобразовании групп методов

Аналогично вызовам универсальных методов вывод типа также должен применяться, когда группа методов M, включающая универсальный метод, преобразуется в данный тип делегата D (§6.6). Если имеется метод

Tr M<X1…Xn>(T1 x1 … Tm xm)

и группа методов M назначается типу делегата D, то задачей вывода типа является поиск аргументов типа S1…Sn, чтобы выражение:

M<S1…Sn>

оказалось совместимым (§15.1) с D.

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

Вместо этого все Xi считаются нефиксированными, и выполняется вывод по нижней границе из каждого типа аргумента Uj для D в соответствующий тип параметра Tj для M. Если для какого-либо Xi границы не были найдены, вывод типа завершается сбоем. Иначе все Xi фиксируются с соответствующими Si, которые являются результатом вывода типа.

7.5.2.14Поиск наиболее подходящего общего типа для набора выражений

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

При наличии набора выражений E1…Em такой вывод должен быть эквивалентен вызову метода

Tr M<X>(X x1 … X xm)

с Ei в качестве аргументов.

Точнее, вывод начинается с нефиксированной переменной типа X. Вывод выходных типов выполняется из каждого выражения Ei в тип X. Наконец, X фиксируется и, в случае успеха, получившийся тип S становится наиболее подходящим общим типом для выражений. Если S не существует, выражения не имеют наиболее общего типа.

7.5.3Разрешение перегрузки

Разрешение перегрузки — это механизм времени привязки для выбора наиболее подходящего члена-функции для вызова по предоставленному списку аргументов и набору кандидатов членов-функций. Разрешение перегрузки позволяет выбрать член-функцию для вызова в следующих отдельных контекстах в C#:

  • вызов метода, указанного в выражении_вызова (§7.6.5.1);

  • вызов конструктора экземпляра, указанного в выражении_создания_объекта (§7.6.10.1);

  • вызов метода доступа к индексатору с помощью доступа_к_элементу (§7.6.6);

  • вызов стандартного или пользовательского оператора, на который есть ссылка в выражении (§7.3.3 и §7.3.4).

Для каждого из этих контекстов набор кандидатов функций-членов и список аргументов определяются по-своему, как подробно описывается в разделах выше. Например, набор кандидатов для вызова метода не включает методы, помеченные с помощью ключевого слова override (§7.4), кроме того в список кандидатов не попадают методы базового класса, если применим любой из методов производного класса (§7.6.5.1).

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

  • При наличии набора применимых кандидатов функций-членов определяется наиболее подходящая функция-член. Если набор содержит только одну функцию-член, то наиболее подходящей функцией-членом является эта функция. Иначе наиболее подходящей функцией-членом является функция-член, более всего подходящая по списку аргументов в соответствии с правилами из раздела §7.5.3.2. Если не удалось найти одну функцию-член, более подходящую, чем остальные, то вызов функции-члена оказывается неоднозначным и возникает ошибка времени привязки.

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

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