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

6.2.2Явные преобразования перечисляемых типов

Поддерживаются следующие явные преобразования перечисляемых типов:

  • Из sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double или decimal к любому перечисляемому_типу.

  • Из любого перечисляемого_типа к sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double или decimal.

  • Из любого перечисляемого_типа к любому другому перечисляемому_типу.

Явное преобразование между двумя перечисляемыми типами выполняется посредством рассмотрения любого из участвующих перечисляемых_типов в качестве базового для этого перечисляемого_типа с последующим выполнением явного или неявного числового преобразования результирующих типов. Например, если для перечислеямого_типа E базовым является тип int, преобразование из E к типу byte выполняется как явное преобразование числового типа (§6.2.1) из int к byte, а преобразование из byte к E — как неявное преобразование числового типа (§6.1.2) из byte к int.

6.2.3Явные преобразования обнуляемых типов

Явные преобразования обнуляемых типов позволяют использовать явные преобразования, выполняемые для необнуляемых типов значений, с обнуляемыми формами таких типов. Для каждого предопределенного явного преобразования из необнуляемого типа значений S к необнуляемому типу значений T (§6.1.1, §6.1.2, §, §6.2.1 и §6.2.2) существуют следующие преобразования обнуляемых типов:

  • Явное преобразование из S? к T?.

  • Явное преобразование из S к T?.

  • Явное преобразование из S? к T.

Вычисление преобразования обнуляемого типа, основанного на преобразовании из S к T, осуществляется следующим образом:

  • Если выполняется преобразование из S? к T?:

  • Если исходным значением является null (свойство HasValue имеет значение false), результатом является значение null типа T?.

  • В противном случае преобразование вычисляется посредством развертывания из S? к S, преобразования из S к T и последующего свертывания из T к T?.

  • Если выполняется преобразование обнуляемого типа из S к T?, оно вычисляется как базовое преобразование из S к T с последующим свертыванием из T в T?.

  • Если выполняется преобразование обнуляемого типа из S? к T, оно вычисляется посредством развертывания из S? в S с последующим базовым преобразованием из S к T.

Обратите внимание, что при попытке развертывания значения null обнуляемого типа порождается исключение.

6.2.4Явные преобразования ссылочных типов

Поддерживаются следующие явные преобразования ссылочных типов:

  • Из object и dynamic любому другому ссылочному_типу.

  • Из любого типа_класса S к любому типу_класса T, если S является базовым классом для T.

  • Из любого типа_класса S к любому типу_интерфейса T, если S не является запечатанным и не реализует T.

  • Из любого типа_интерфейса S к любому типу_класса T, если T не является запечатанным или реализует S.

  • Из любого типа_интерфейса S к любому типу_интерфейса T, если S не является производным от T.

  • Из типа_массива S, который имеет тип элементов SE, к типу_ массива T, который имеет тип элементов TE, если выполняются следующие условия:

  • S и T различаются только по типу элементов. Другими словами, типы S и T имеют одинаковое число измерений.

  • SE и TE являются ссылочными_типами.

  • Существует явное преобразование ссылочного типа из SE к TE.

  • Из System.Array и реализуемых им интерфейсов к любому типу_массива.

  • Из одномерного типа массива S[] к System.Collections.Generic.IList<T> и его базовым интерфейсам, если существует явное преобразование ссылочного типа из S к T.

  • Из System.Collections.Generic.IList<S> и его базовых интерфейсов к одномерному типу массива T[], если существует явное преобразование идентификатора или ссылочного типа из S к T.

  • Из System.Delegate и реализуемых им интерфейсов к любому типу_делегата.

  • Из ссылочного типа к ссылочному типу T, при наличии неявного ссылочного преобразования к ссылочному типу T0 и наличии у T0 преобразования идентификатора к T.

  • Из любого ссылочного типа к типу T интерфейса или делегата, при наличии неявного преобразования идентификатора к интерфейсу или делегату типа T0 и наличии у T0 вариантов преобразований к T или наличии у T вариантов преобразований (§13.1.3.2) к T0.

  • Из D<S1…Sn> к D<T1…Tn>, где D<X1…Xn> является универсальным типом делегата, D<S1…Sn> несовместим с D<S1…Sn> или идентичен ему, и для каждого параметра Xi типа D верно, что:

  • Если Xi является инвариантным, тогда Si идентичен Ti.

  • Если Xi является ковариантным, тогда существует неявное или явное преобразование идентификации или ссылочное преобразование из Si в Ti.

  • Если Xi является контравариантным, тогда Si и Ti либо идентичны, либо оба являются ссылочными типами.

  • Явные преобразования, включающие параметры типа, которые имеют ссылочный тип. Дополнительные сведения о явных преобразованиях, включающих параметры типа, см. в §6.2.6.

Для явных преобразований ссылочных типов требуется проверка корректности во время выполнения.

Для успешного выполнения явного преобразования ссылочного типа во время выполнения исходный операнд должен иметь значение null, или фактический тип объекта, на который ссылается исходный операнд, должен являться типом, который можно преобразовать в конечный тип с помощью неявного преобразования ссылочного типа (§6.1.6) или упаковки (§6.1.7). В случае сбоя явного преобразования ссылочного типа порождается исключение System.InvalidCastException.

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

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