Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Важно учитывать, находится ли результат преобразования типов в пределах диапазона целевого типа данных.
Расширяющее преобразование изменяет значение на тип данных, который может вместить любое возможное значение оригинального типа данных. Расширяющие преобразования сохраняют исходное значение, но могут изменить его представление. Это происходит при преобразовании из целочисленного типа в Decimal
, или из Char
в String
.
Сужающее преобразование изменяет значение на тип данных, который может не содержать некоторые из возможных значений. Например, дробное значение округляется при преобразовании в целочисленный тип, а числовой тип, преобразованный в Boolean
, уменьшается до одного True
или False
.
Расширение преобразований
В следующей таблице показаны стандартные расширяющие преобразования.
Тип данных | Расширение до типов данных 1 |
---|---|
SByte |
SByte , Short , Integer Long Decimal Single Double |
Байт |
Byte , Short , UShort Integer UInteger Long ULong Decimal Single Double |
short |
Short , , Integer Long Decimal Single ,Double |
UShort |
UShort , Integer , UInteger Long ULong Decimal Single Double |
Целое число |
Integer , , Long Decimal Single , Double 2 |
UInteger |
UInteger , Long , ULong Decimal Single Double |
Длинный |
Long , , Decimal Single Double 2 |
ULong |
ULong , , Decimal Single Double 2 |
Десятичное число |
Decimal , Single Double 2 |
Один |
Single , Double |
Двойной | Double |
Любой перечислимый тип (Перечисление) | Его базовый целочисленный тип и любой тип, до которого базовый тип расширяется. |
Уголь |
Char , String |
массив Char |
Char массив String |
Любой тип | Объект |
Любой производный тип | Любой базовый тип, из которого производен тип 3. |
Любой тип | Любой интерфейс, который он реализует. |
Ничто | Любой тип данных или тип объекта. |
1 По определению каждый тип данных расширяется до самого себя.
2 Преобразования из Integer
, UInteger
, Long
, ULong
или Decimal
в Single
или Double
могут привести к потере точности, но никогда не ведут к потере величины. В этом смысле они не несут потери информации.
3 Может показаться удивительным, что преобразование из производного типа в один из его базовых типов расширяется. Обоснование заключается в том, что производный тип содержит все члены базового типа, поэтому он квалифифисируется как экземпляр базового типа. В противоположном направлении базовый тип не содержит новых элементов, определенных производным типом.
Расширяющие преобразования всегда успешны во время выполнения и никогда не приводят к потере информации. Вы всегда можете выполнять их неявно, независимо от того, установлено ли в инструкции Option Strict переключение проверки типов в On
или Off
.
Сужение преобразований
Ниже приведены стандартные сужающие преобразования.
Обратные направления для расширения преобразований, указанных в предыдущей таблице (кроме случая, когда каждый тип расширяется сам по себе)
Преобразования из Boolean в любой числовой тип и наоборот
Преобразования из любого числового типа в любой перечислимый тип (
Enum
)Преобразования в обоих направлениях между String и любым числовым типом,
Boolean
, или датаПреобразование типа данных или типа объекта в тип, производный от него
Сужающие преобразования не всегда успешны во время выполнения и могут завершиться сбоем или потерей данных. Ошибка возникает, если целевой тип данных не может получить преобразованное значение. Например, числовое преобразование может привести к переполнению. Компилятор не позволяет выполнять сужающие преобразования неявно, если оператор 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