Расширяющие и сужающие преобразования (Visual Basic)
Важно учитывать, является ли результат преобразования в диапазоне целевого типа данных.
Расширение преобразования изменяет значение типа данных, которое может разрешить любое возможное значение исходных данных. Расширяющие преобразования сохраняют исходное значение, но могут изменить его представление. Это происходит при преобразовании целочисленного типа Decimal
в ,или из String
Char
.
Преобразование сужения изменяет тип данных значения на тип, который не сможет содержать некоторые возможные значения. Например, дробное значение округляется при преобразовании в целочисленный тип, а числовой тип, преобразованный в Boolean
, уменьшается до одного True
или False
.
Расширяющие преобразования
В следующей таблице показаны стандартные преобразования расширения.
Тип данных | Расширение до типов данных 1 |
---|---|
SByte | SByte , Short , Integer Long Decimal Single Double |
Byte | Byte , Short , UShort Integer UInteger Long ULong Decimal Single Double |
Short | Short , , Integer Decimal Long Single ,Double |
UShort | UShort , Integer , UInteger Long ULong Decimal Single Double |
Целое число | Integer , , Decimal Single Long , 2 Double |
UInteger | UInteger , Long , ULong Decimal Single Double 2 |
Long | Long , , Decimal Double Single 2 |
ULong | ULong , , Decimal Double Single 2 |
Десятичное число | Decimal , Single Double 2 |
Один | Single , Double |
Двойной | Double |
Любой перечислимый тип (Перечисление) | Его базовый целочисленный тип и любой тип, к которому расширяется базовый тип. |
Char | Char , String |
Char массив |
Char Массива String |
Любой тип | Объект |
Любой производный тип | Любой базовый тип, от которого он является производным 3. |
Любой тип | Любой интерфейс, который он реализует. |
Nothing | Любой тип данных или тип объекта. |
1 По определению каждый тип данных расширяется.
2 Преобразования из Integer
, , UInteger
или Long
ULong
в или Double
Single
Decimal
могут привести к потере точности, но никогда не потери величины. В этом смысле они не несут потери информации.
3 Может показаться удивительным, что преобразование из производного типа в один из его базовых типов расширяется. Обоснование заключается в том, что производный тип содержит все члены базового типа, поэтому он квалифифисируется как экземпляр базового типа. В противоположном направлении базовый тип не содержит новых элементов, определенных производным типом.
Расширяющие преобразования всегда успешно выполняются во время выполнения и никогда не теряют данные. Их всегда можно выполнять неявно, независимо от того, задает ли оператор Option Strict тип проверка переключение на On
или в Off
.
Сужающие преобразования
Ниже приведены стандартные сужающие преобразования.
Обратные направления преобразований расширения в предыдущей таблице (за исключением того, что каждый тип расширяется для себя)
Преобразования в любом направлении между логическим и любым числовым типом
Преобразования из любого числового типа в любой перечислимый тип (
Enum
)Преобразования в любом направлении между строкой и любым числовым типом,
Boolean
или DateПреобразование типа данных или типа объекта в тип, производный от него
Сужающие преобразования не всегда выполняются во время выполнения и могут привести к сбою или потере данных. Ошибка возникает, если целевой тип данных не может получить преобразованное значение. Например, числовое преобразование может привести к переполнению. Компилятор не позволяет выполнять сужающие преобразования неявно, если оператор Option Strict не задает тип проверка переключениеOff
.
Примечание.
Ошибка сужения преобразования подавляется для преобразования элементов в For Each…Next
коллекцию в переменную элемента управления циклом. Дополнительные сведения и примеры см. в разделе "Сужение преобразований" в разделе "Для каждого... Следующая инструкция.
Использование сужающих преобразований
Вы используете сужающее преобразование, если известно, что исходное значение можно преобразовать в целевой тип данных без ошибки или потери данных. Например, если у вас есть известное String
значение "True" или "False", можно использовать CBool
ключевое слово для преобразования в негоBoolean
.
Исключения во время преобразования
Так как расширяющие преобразования всегда выполняются успешно, они не вызывают исключений. Сужающие преобразования, когда они завершаются ошибкой, чаще всего вызывают следующие исключения:
InvalidCastException — если преобразование не определено между двумя типами
OverflowException — (целочисленные типы, только если преобразованное значение слишком велико для целевого типа)
Если класс или структура определяют функцию CType, которая будет служить оператором преобразования в этот класс или структуру, которая CType
может вызвать любое исключение, которое он считает подходящим. Кроме того, это CType
может вызывать функции Visual Basic или методы платформа .NET Framework, которые, в свою очередь, могут вызывать различные исключения.
Изменения во время преобразования ссылочного типа
Преобразование из ссылочного типа копирует только указатель на значение. Само значение не копируется и не изменяется каким-либо образом. Единственное, что может измениться, — это тип данных переменной, владеющей указателем. В следующем примере тип данных преобразуется из производного класса в базовый класс, но объект, на который теперь указывают обе переменные, не изменяется.
' Assume class cSquare inherits from class cShape.
Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square