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

7.5.3.1Применимая функция-член

Функция-член называется применимой функцией-членом в соответствии со списком аргументов A, когда выполняются все следующие условия.

  • Каждый аргумент в A соответствует параметру в объявлении функции члена, как описано в §7.5.1.1, и любой параметр, которому не соответствует аргумент, является необязательным параметром.

  • Для каждого аргумента в A режим передачи параметра для аргумента (то есть по значению, с помощью ключевых слов ref или out) совпадает с режимом передачи соответствующего параметра и

  • для параметра значения или массива параметров существует неявное преобразование (§6.1) из аргумента в тип соответствующего параметра или

  • для параметров, передаваемых с помощью ref или out, тип аргумента идентичен типу соответствующего параметра. В конечном счете параметры типа ref или out представляют собой псевдонимы для передаваемых аргументов.

Для функции-члена, включающей массив параметров, если функция-член применима в соответствии с указанными правилами, то она называется применимой в нормальной форме. Если функция-член, включающая массив параметров, не применима в нормальной форме, то она может быть применима в расширенной форме.

  • Расширенная форма создается путем замены массива параметров в объявлении функции-члена на ноль или другое число параметров с типом элементов массива параметров, так чтобы число аргументов в списке аргументов A совпадало с общим числом параметров. Если в списке A меньше аргументов, чем число фиксированных параметров в объявлении функции-члена, то создать расширенную форму функции-члена нельзя и поэтому она неприменима.

  • Иначе расширенная форма применима, если для каждого аргумента в списке A режим передачи параметра для аргумента идентичен режиму передачи соответствующего параметра и

  • для фиксированного параметра значения или параметра значения, созданного при расширении, существует неявное преобразование (§6.1) из типа аргумента в тип соответствующего параметра или

  • для параметров, передаваемых с помощью ref или out, тип аргумента идентичен типу соответствующего параметра.

7.5.3.2Более подходящая функция-член

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

Списки параметров для каждого кандидата функции-члена формируется следующим способом:

  • Расширенная форма используется в случае, если функция-член была применима только в расширенной форме.

  • Необязательные параметры без соответствующих аргументов удаляются из списка параметров

  • Порядок параметров изменяется таким образом, что они встречаются в той же позиции, что и соответствующий аргумент в списке аргументов.

При наличии списка аргументов A с набором выражений аргументов { E1, E2, ..., EN } и двух применимых функций-членов MP и MQ с типами параметров { P1, P2, ..., PN } и { Q1, Q2, ..., QN } MP считается более подходящей функцией-членом, чем MQ, если

  • для каждого аргумента неявное преобразование из EX в QX не лучше неявного преобразования из EX в PX и

  • по крайней мере для одного аргумента преобразование из EX в PX лучше преобразования из EX в QX.

При проведении этой оценки если MP или MQ применима в расширенной форме, то PX или QX относится к параметру в расширенной форме списка параметров.

Если последовательности типов параметров { P1, P2, …, PN } и { Q1, Q2, …, QN} идентичны, то для определения более подходящей функции-члена применяются следующие правила разрешения.

  • Если MP не является универсальным методом, а MQ — универсальный метод, то MP является более подходящей, чем MQ.

  • Иначе, если MP применима в нормальной форме, а MQ имеет массив params и применима только в расширенной форме, то MP является более подходящей, чем MQ.

  • Иначе, если у MP больше объявленных параметров, чем у MQ, то MP является более подходящей, чем MQ. Это может просходить, когда у обеих функций-членов есть массивы params, применимые только в расширенных формах.

  • Иначе, если у всех параметров MP есть соответствующий аргумент, тогда как аргументы по умолчанию должны быть заменены на по меньшей мере один необязательный параметр в MQ, то MP является более подходящей, чем MQ.

  • Иначе, если у MP более конкретные типы параметров, чем у MQ, то MP является более подходящей, чем MQ. Пусть наборы {R1, R2, …, RN} и {S1, S2, …, SN} представляют неинициализированные и нерасширенные типы параметров функций-членов MP и MQ. Типы параметров MP являются более конкретными, чем у MQ, если для любого параметра RX является не менее конкретным, чем SX, и по крайней мере один параметр RX является более конкретным, чем SX.

  • Параметр типа является менее конкретным, чем не параметр типа.

  • Один сформированный тип является более конкретным, чем другой (с таким же числом аргументов типа), если у первого типа по крайней мере один аргумент типа является более конкретным по сравнению с соответствующим аргументом типа второго типа и нет аргументов типа менее конкретных по сравнению с соответствующими аргументами типа другого сформированного типа.

  • Тип массива является более конкретным, чем другой тип массива (с таким же числом измерений), если тип элементов первого является более конкретным, чем тип элементов второго.

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

  • Иначе определить более подходящую функцию-член нельзя.

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