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

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

При наличии набора выражений 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, тип аргумента идентичен типу соответствующего параметра.

Наши рекомендации