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

7.5.2.7Вывод явных типов параметров

Явный Вывод типа параметра выполняется из выражения E с типом T следующим образом:

  • Если E является анонимной функцией c явным указанием типа с типами параметров U1…Uk, а T является типом делегата или типом дерева выражения с типами параметров V1…Vk, то для каждого Ui выполняется точный вывод (§7.5.2.8) из Ui к соответствующему Vi.

7.5.2.8Точный вывод

Точный вывод из типа U для типа V выполняется следующим образом.

  • Если V является одним из нефиксированных Xi, то U добавляется к набору границ для Xi.

  • Иначе, наборы V1…Vk и U1…Uk определяются проверкой применимости одного из следующих случаев:

  • V является типом массива V1[…], а U - U1[…] того же ранга

  • V является типом V1?, а U - типом U1?

  • V является сформированным типом C<V1…Vk>, а U - сформированным типом C<U1…Uk>

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

  • Иначе вывод не производится.

7.5.2.9Вывод нижних границ

Вывод нижних границ из типа U для типа V выполняется следующим образом.

  • Если V является одним из нефиксированных Xi, то U добавляется к набору нижних границ для Xi.

  • Иначе, наборы U1…Uk и V1…Vk определяются проверкой применимости одного из следующих случаев:

  • V является типом массива V1[…], а U - U1[…] (или типом параметра, эффективный базовый тип которого - U1[…]) того же ранга

  • V - один из IEnumerable<V1>, ICollection<V1> или IList<V1>, а U - тип одномерного массива U1[] (или параметр типа, эффективный базовый тип которого - U1[])

  • V является типом V1?, а U - тип V1?

  • V - сформированный класс, структура, интерфейс или тип делегата C<V1…Vk>; также существует уникальный тип C<U1…Uk>, в котором U (или, если U является параметром типа, его эффективный базовый класс или любой член его набора эффективных интерфейсов) идентичен, наследует от (напрямую или косвенно) или реализует (напрямую или косвенно) C<U1…Uk>.

(Ограничение "уникальности" означает, что в случае interface C<T>{} class U: C<X>, C<Y>{} во время вывода из U в C<T> вывод произведен не будет, так как U1 может быть X или Y.)

Если применим хотя бы один из этих случаев, выполняется точный вывод из каждого Ui в соответствующий Vi следующим образом:

  • Если неизвестно, что Ui является ссылочным типом, выполняется точный вывод

  • Иначе, если U - тип массива, выполняется вывод по нижней границе

  • Иначе, если V является C<V1…Vk>, вывод зависит от i-го параметра типа C:

  • Если он ковариантен, выполняется вывод по нижней границе.

  • Если он контрвариантен, выполняется вывод по верхней границе.

  • Если он инвариантен, выполняется точный вывод.

  • Иначе вывод не производится.

7.5.2.10Вывод по верхним границам

Вывод верхних границ из типа U для типа V выполняется следующим образом.

  • Если V является одним из нефиксированных Xi, то U добавляется к набору верхних границ для Xi.

  • Иначе, наборы V1…Vk и U1…Uk определяются проверкой применимости одного из следующих случаев:

  • U является типом массива U1[…], а V - U1[…] того же ранга

  • U - один из IEnumerable<Ue>, ICollection<Ue> или IList<Ue>, а V - тип одномерного массива Ve[]

  • U является типом U1?, а V - типом V1?

  • U - сформированный класс, структура, интерфейс или тип делегата C<U1…Uk>, а V - класс, структура, интерфейс или тип делегата, идентичный, наследующий от (напрямую или косвенно), или реализующий (напрямую или косвенно) уникальный тип C<U1…Uk>

(Ограничение "уникальности" означает, что в случае interface C<T>{} class V<Z>: C<X<Z>>, C<Y<Z>>{} при выводе из C<U1> в V<Q> вывод производиться не будет. Вывод не выполняется из U1 в X<Q> или Y<Q>.)

Если применим хотя бы один из этих случаев, выполняется точный вывод из каждого Ui в соответствующий Vi следующим образом:

  • Если неизвестно, что Ui является ссылочным типом, выполняется точный вывод

  • Иначе, если V является типом массива, выполняется вывод по верхней границе

  • Иначе, если U является C<U1...Uk>, вывод зависит от i-го параметра типа C:

  • Если он ковариантен, выполняется вывод по верхней границе.

  • Если он контрвариантен, выполняется вывод по нижней границе.

  • Если он инвариантен, выполняется точный вывод.

  • Иначе вывод не производится.

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