Более подходящая функция-член
Для целей определения наиболее подходящей функции-члена формируется укороченный список аргументов А, содержащий только сами выражения аргументов в том порядке, в каком они присутствуют в исходном списке аргументов.
Списки параметров для каждого кандидата функции-члена формируется следующим способом:
· Расширенная форма используется в случае, если функция-член была применима только в расширенной форме.
· Необязательные параметры без соответствующих аргументов удаляются из списка параметров
· Порядок параметров изменяется таким образом, что они встречаются в той же позиции, что и соответствующий аргумент в списке аргументов.
При наличии списка аргументов 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} идентичны (т. е. для каждого Pi имеется тождественное преобразование в соответствующий Qi), то для определения более подходящей функции-члена применяются следующие правила разрешения.
· Если 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.
o Параметр типа является менее конкретным, чем не параметр типа.
o Один сформированный тип является более конкретным, чем другой (с таким же числом аргументов типа), если у первого типа по крайней мере один аргумент типа является более конкретным по сравнению с соответствующим аргументом типа второго типа и нет аргументов типа менее конкретных по сравнению с соответствующими аргументами типа другого сформированного типа.
o Тип массива является более конкретным, чем другой тип массива (с таким же числом измерений), если тип элементов первого является более конкретным, чем тип элементов второго.
· Иначе, если один член не является оператором с нулификацией, а другой является, то оператор без нулификации считается более подходящим.
· Иначе определить более подходящую функцию-член нельзя.
7.5.3.3 Лучшее преобразование из выражения
При наличии неявного преобразования C1, которое переводит выражение E в тип T1, и неявного преобразования C2, которое переводит выражение E в тип T2, C1 является лучшим преобразованием, чем C2, если верно хотя бы одно из следующих утверждений:
· E имеет тип S, также существует преобразование идентификации из S в T1, но не из S в T2.
· E не является анонимной функцией, а T1 является более подходящей целью преобразования, чем T2 (§7.5.3.5).
· E является анонимной функцией, T1 является либо типом делегата D1, либо типом дерева выражения Expression<D1>, T2 является либо типом делегата D2, либо типом дерева выражения Expression<D2>, и верно одно из следующих утверждений:
o D1 является более подходящей целью преобразования, чем D2.
o D1 и D2 имеют идентичные списки параметров, и верно одно из следующих утверждений:
· D1 имеет тип возвращаемого значения Y1, а D2 — тип возвращаемого значения Y2, выведенный тип возвращаемого значения X существует для E в контексте данного списка параметров (§7.5.2.12), и преобразование из X в Y1 является более подходящим, чем преобразование из X в Y2.
· E является асинхронным выражением, D1 имеет тип возвращаемого значения Task<Y1>, а D2 имеет тип возвращаемого значения Task<Y2>, выведенный тип возвращаемого значения Task<X> существует для E в контексте данного списка параметров (§7.5.2.12), и преобразование из X в Y1 является более подходящим, чем преобразование из X в Y2.
· D1 имеет тип возвращаемого значения Y, а D2 возвращает значение void
7.5.3.4 Лучшее преобразование из типа
При наличии преобразования C1, которое переводит тип S в тип T1, и преобразования C2, которое переводит тип S в тип T2, C1 является лучшим преобразованием, чем C2, если верно хотя бы одно из следующих утверждений:
· Существует тождественное преобразование из S в T1, и не существует преобразования из S в T2.
· T1 является лучшей целью для преобразования, чем T2 (§7.5.3.5).
7.5.3.5 Лучшая цель для преобразования
В случае, если даны два различных типа T1 и Т2, Т1 является лучшей целью для преобразования, чем Т2, если верно одно из следующих утверждений:
· Существует неявное преобразование из T1 в T2, и нет неявного преобразования из T2 в T1.
· T1 является целым типом со знаком, а T2 является целым типом без знака. А именно:
o T1 имеет тип sbyte, а T2 имеет тип byte, ushort, uint или ulong
o T1 имеет тип short, а T2 имеет тип ushort, uint или ulong.
o T1 имеет тип int, а T2 имеет тип uint или ulong.
o T1 равно long и T2 равно ulong.