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

7.5.3.3Лучшее преобразование из выражения

При наличии неявного преобразования C1, которое переводит выражение E в тип T1, и неявного преобразования C2, которое переводит выражение E в тип T2, лучшее преобразование из двух определяется следующим образом.

  • E имеет тип S, также существует преобразование идентификации из S в T1, но не из S в T2

  • E не является анонимной функцией, а T1 является более подходящей целью преобразования, чем T2 (§7.5.3.5)

  • E является анонимной функцией, T1 является либо типом делегата D1, либо типом дерева выражения Expression<D1>, T2 является либо типом делегата D2, либо типом дерева выражения Expression<D2>, и верно одно из следующих утверждений:

  • D1 является более подходящей целью преобразования, чем D2

  • D1 и D2 имеют идентичные списки параметров, и верно одно из следующих утверждений:

  • D1 имеет тип возвращаемого значения Y1, а D2 - тип возвращаемого значения Y2, выведенный тип возвращаемого значения 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 и T2, T1 является лучшей целью для преобразования, чем T2, если верно одно из следующих утверждений:

  • Существует неявное преобразование из T1 в T2, и нет неявного преобразования из T2 в T1

  • T1 является целым типом со знаком, а T2 является целым типом без знака. В частности:

  • T1 является sbyte, а T2 является byte, ushort, uint или ulong

  • T1 является short, а T2 является ushort, uint или ulong

  • T1 является int, а T2 является uint или ulong

  • T1 является long, а T2 является ulong

7.5.3.6Перегрузка в универсальных классах

Несмотря на то что сигнатуры при объявлении должны быть уникальными, при замене аргументов типа могут создаваться идентичные сигнатуры. В таких случаях конечные правила разрешения перегрузки, описанные выше, позволят выбрать конкретный член.

В следующих примерах показываются допустимые и недопустимые в соответствии с этим правилом перегрузки:

interface I1<T> {...}

interface I2<T> {...}

class G1<U> { int F1(U u); // Overload resulotion for G<int>.F1 int F1(int i); // will pick non-generic

void F2(I1<U> a); // Valid overload void F2(I2<U> a); }

class G2<U,V> { void F3(U u, V v); // Valid, but overload resolution for void F3(V v, U u); // G2<int,int>.F3 will fail

void F4(U u, I1<V> v); // Valid, but overload resolution for void F4(I1<V> v, U u); // G2<I1<int>,int>.F4 will fail

void F5(U u1, I1<V> v2); // Valid overload void F5(V v1, U u2);

void F6(ref U u); // valid overload void F6(out V v); }

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