В одном выражении могут быть сгруппированы операнды различных типов. Однако возможность смешения в одном выражении операндов различных типов связана с определёнными проблемами на этапе выполнения программы и в ряде случаев требует дополнительного внимания со стороны программиста.
Прежде всего, КАК производится это преобразование. Иногда оно производится абсолютно незаметно и не требует дополнительных усилий со стороны программиста. Все необходимые преобразования осуществляется автоматически в ходе выполнения программы. Такие преобразования называются неявными. Однако чаще программист вынужден явным образом указывать необходимость преобразования, используя выражения приведения типа или обращаясь к специальным методам преобразования, определённым в классе System.Convert.
Приведение типов – один из аспектов безопасности языка. Всё должно быть устроено таким образом, чтобы логика преобразования значений одного типа к другому типу была бы понятной, а результаты этих преобразований предсказуемы.
Используемые в программе типы характеризуются собственными диапазонами значений, которые определяются свойствами типов. В том числе и размером области памяти, предназначенной для кодирования значений соответствующего типа. При этом области значений различных типов пересекаются. Многие значения можно выразить более чем одним типом. Например, значение 4 можно представить как целое число или как число с плавающей точкой.
Преобразование типа создает значение нового типа, эквивалентное значению старого типа, однако при этом не обязательно сохраняется идентичность (или точные значения) двух объектов.
Различаются:
Расширяющее преобразование – значение одного типа преобразуется к значению другого типа, которое имеет такой же или больший размер. Например, значение, представленное в виде 32-разрядного целого числа со знаком, может быть преобразовано в 64-разрядное целое число со знаком. Расширяющее преобразование считается безопасным, поскольку исходная информация при таком преобразовании не искажается.
Тип
Возможно безопасное преобразование к типу…
Byte
UInt16, Int16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal
SByte
Int16, Int32, Int64, Single, Double, Decimal
Int16
Int32, Int64, Single, Double, Decimal
UInt16
UInt32, Int32, UInt64, Int64, Single, Double, Decimal
Char
UInt16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal
Int32
Int64, Double, Decimal
UInt32
Int64, Double, Decimal
Int64
Decimal
UInt64
Decimal
Single
Double
Некоторые расширяющие преобразования типа могут привести к потере точности. Следующая таблица описывает варианты преобразований, которые иногда приводят к потере информации.
Тип
Возможна потеря точности при преобразовании к типу…
Int32
Single
UInt32
Single
Int64
Single, Double
UInt64
Single, Double
Decimal
Single, Double
Сужающее преобразование - значение одного типа преобразуется к значению другого типа, которое имеет меньший размер (из 64-разрядного в 32-разрядное). Такое преобразование потенциально опасно потерей значения.
Сужающие преобразования могут приводить к потере информации. Если тип, к которому осуществляется преобразование, не может правильно передать значение источника, то результат преобразования оказывается равен константе PositiveInfinity или NegativeInfinity.
При этом значение PositiveInfinity интерпретируется как результат деления положительного числа на ноль, а значение NegativeInfinity интерпретируется как результат деления отрицательного числа на ноль.
Если сужающее преобразование обеспечивается методами класса System.Convert, то потеря информации сопровождается генерацией исключения (об этом позже).
Тип
Возможна потеря значения и генерация исключения при преобразовании в: