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

6.2Явные преобразования

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

  • Все неявные преобразования.

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

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

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

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

  • Явные преобразования типов интерфейса.

  • Преобразования распаковки.

  • Неявные динамические преобразования.

  • Пользовательские явные преобразования.

Явные преобразования могут произойти в выражениях приведения (§7.7.6).

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

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

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

Явные преобразования числовых типов предназначены для преобразования из одного числового_типа к другому числовому_типу, для которого не существует неявного преобразования (§6.1.2):

  • из sbyte к byte, ushort, uint, ulong или char;

  • из byte к sbyte и char;

  • из short к sbyte, byte, ushort, uint, ulong или char;

  • из ushort к sbyte, byte, short или char;

  • из int к sbyte, byte, short, ushort, uint, ulong или char;

  • из uint к sbyte, byte, short, ushort, int или char;

  • из long к sbyte, byte, short, ushort, int, uint, ulong или char;

  • из ulong к sbyte, byte, short, ushort, int, uint, long или char;

  • из char к sbyte, byte или short;

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

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

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

Поскольку явные преобразования включают в себя все неявные и явные преобразования числовых типов, всегда возможно преобразование из одного числового_типа к другому с помощью выражения приведения (§7.7.6).

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

  • Для преобразований из одного целого типа в другой порядок выполнения зависит от контекста проверки переполнения (§7.6.12), в котором выполняется такое преобразование:

  • В контексте checked преобразование выполняется успешно, если значение исходного операнда является допустимым для конечного типа. В противном случае порождается исключение System.OverflowException.

  • В контексте unchecked преобразование всегда выполняется успешно следующим образом:

  • Если размер исходного типа превышает размер конечного, дополнительные самые старшие разряды исходного значения отбрасываются. Результат обрабатывается как значение конечного типа.

  • Если размер исходного типа меньше размера конечного, размер исходного значения расширяется до размера конечного типа за счет добавления знака или нулей. Расширение знаком используется для исходных типов со знаком, расширение нулями — для исходных типов без знака. Результат обрабатывается как значение конечного типа.

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

  • Для преобразований из типа decimal к целому типу исходное значение округляется в сторону нуля до ближайшего целого значения. Результатом преобразования является полученное целое значение. Если результирующее целое значение находится вне диапазона конечного типа, порождается исключение System.OverflowException.

  • Для преобразований из типа float или double к целому типу порядок выполнения зависит от контекста проверки переполнения (§7.6.12), в котором выполняется такое преобразование:

  • В контексте checked преобразование осуществляется следующим образом:

  • Если операнд имеет нечисловое значение или равен бесконечности, порождается исключение System.OverflowException.

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

  • В противном случае порождается исключение System.OverflowException.

  • В контексте unchecked преобразование всегда выполняется успешно следующим образом:

  • Если операнд имеет нечисловое значение или равен бесконечности, результатом преобразования является неопределенное значение конечного типа.

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

  • В противном случае в качестве результата преобразования возвращается неопределенное значение конечного типа.

  • Для преобразования из double к float значение типа double округляется до ближайшего значения типа float. Если значение double слишком мало для представления в качестве float, результатом становится положительный нуль или отрицательный нуль. Если значение double слишком велико для представления в качестве float, результатом становится положительная бесконечность или отрицательная бесконечность. Если значение double является нечисловым, результат также является нечисловым значением.

  • Для преобразования из float или double к типу decimal исходное значение преобразуется в представление decimal и при необходимости округляется до ближайшего числа после 28-го десятичного разряда (§4.1.7). Если исходное значение слишком мало для представления в качестве десятичного, в качестве результата возвращается нуль. Если исходное значение является нечисловым, бесконечностью или слишком велико для представления в виде decimal, порождается исключение System.OverflowException.

  • Для преобразования из decimal к float или double значение типа decimal округляется до ближайшего значения типа double или float. Это преобразование может привести к потере точности, но никогда не порождает исключений.

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