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

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

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

  • из sbyte к short, int, long, float, double или decimal;

  • из byte к short, ushort, int, uint, long, ulong, float, double или decimal;

  • из short к int, long, float, double или decimal;

  • из ushort к int, uint, long, ulong, float, double или decimal;

  • из int к long, float, double или decimal;

  • из uint к long, ulong, float, double или decimal;

  • из long к float, double или decimal;

  • из ulong к float, double или decimal;

  • из char к ushort, int, uint, long, ulong, float, double или decimal;

  • из float к double.

Преобразования из типов int, uint, long или ulong к float, а также из long или ulong к double могут привести к потере точности, но не величины. Другие неявные преобразования числовых типов никогда не приводят к потере данных.

Неявных преобразований к типу char не существует, поэтому значения любых других целых типов не могут быть преобразованы к типу char.

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

Неявное преобразование перечисляемых типов обеспечивает преобразование литерала_целого_типа или типа_decimal 0 к любому перечисляемому_типу или к любому обнуляемому_типу, базовым для которого является перечисляемый_тип. В последнем случае выполняется преобразование к базовому перечисляемому_типу и последующее свертывание результата (§4.1.10).

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

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

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

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

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

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

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

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

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

6.1.5Преобразования литерала null

Существует неявное преобразование литерала null к любому обнуляемому типу. В результате преобразования получается значение null (§4.1.10) заданного обнуляемого типа.

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

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

  • Из любого ссылочного_типа к object и dynamic.

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

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

  • Из любого типа_интерфейса 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.Delegate и реализуемым им интерфейсам.

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

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

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

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

Неявные преобразования ссылочных_типов всегда выполняются успешно и не требуют проверки во время выполнения.

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

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