Поиск наиболее подходящего общего типа для набора выражений
В некоторых случаях для набора выражений необходимо вывести общий тип. В частности, типы элементов для массивов с неявным указанием типа и типы возвращаемых значений анонимных функций с телом в виде блока находятся следующим образом.
При наличии набора выражений E1…Em такой вывод должен быть эквивалентен вызову метода
Tr M<X>(X x1 … X xm)
с Ei в качестве аргументов.
Точнее, вывод начинается с нефиксированной переменной типа X. Вывод выходных типов выполняется из каждого Ei в тип X. Наконец, X фиксируется и, в случае успеха, получившийся тип S становится наиболее подходящим общим типом для выражений. Если S не существует, выражения не имеют наиболее общего типа.
Разрешение перегрузки
Разрешение перегрузки — это механизм времени привязки для выбора наиболее подходящего члена-функции для вызова по предоставленному списку аргументов и набору кандидатов членов-функций. Разрешение перегрузки позволяет выбрать член-функцию для вызова в следующих отдельных контекстах в 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. Если не удалось найти одну функцию-член, более подходящую, чем остальные, то вызов функции-члена оказывается неоднозначным и возникает ошибка времени привязки.
В следующих разделах определяется значение терминов применимая функция-член и более подходящая функция-член.
Применимая функция-член
Функция-член называется применимой функцией-членом в соответствии со списком аргументов A, когда выполняются все следующие условия.
· Каждый аргумент в A соответствует параметру в объявлении функции члена, как описано в §7.5.1.1, и любой параметр, которому не соответствует аргумент, является необязательным параметром.
· Для каждого аргумента в A режим передачи параметра для аргумента (то есть по значению, с помощью ключевых слов ref или out) совпадает с режимом передачи соответствующего параметра и
o для параметра значения или массива параметров существует неявное преобразование (§6.1) из аргумента в тип соответствующего параметра или
o для параметров, передаваемых с помощью ref или out, тип аргумента идентичен типу соответствующего параметра. В конечном счете параметры ref или out представляют собой псевдонимы для передаваемых аргументов.
Для функции-члена, включающей массив параметров, если функция-член применима в соответствии с указанными правилами, то она называется применимой в нормальной форме. Если функция-член, включающая массив параметров, не применима в нормальной форме, то она может быть применима в расширенной форме.
· Расширенная форма создается путем замены массива параметров в объявлении функции-члена на ноль или другое число параметров с типом элементов массива параметров, так чтобы число аргументов в списке аргументов A совпадало с общим числом параметров. Если в списке A меньше аргументов, чем число фиксированных параметров в объявлении функции-члена, то создать расширенную форму функции-члена нельзя и поэтому она неприменима.
· Иначе расширенная форма применима, если для каждого аргумента в списке A режим передачи параметра для аргумента идентичен режиму передачи соответствующего параметра и
o для фиксированного параметра значения или параметра значения, созданного при расширении, существует неявное преобразование (§6.1) из типа аргумента в тип соответствующего параметра или
o для параметров, передаваемых с помощью ref или out, тип аргумента идентичен типу соответствующего параметра.