Расширяющие и сужающие преобразования (Visual Basic)

Важно учитывать, является ли результат преобразования в диапазоне целевого типа данных.

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

Преобразование сужения изменяет тип данных значения на тип, который не сможет содержать некоторые возможные значения. Например, дробное значение округляется при преобразовании в целочисленный тип, а числовой тип, преобразованный в Boolean , уменьшается до одного True или False.

Расширяющие преобразования

В следующей таблице показаны стандартные преобразования расширения.

Тип данных Расширение до типов данных 1
SByte SByte, Short, IntegerLongDecimalSingleDouble
Byte Byte, Short, UShortIntegerUIntegerLongULongDecimalSingleDouble
Short Short, , IntegerDecimalLongSingle,Double
UShort UShort, Integer, UIntegerLongULongDecimalSingleDouble
Целое число Integer, , DecimalSingleLong, 2 Double
UInteger UInteger, Long, ULongDecimalSingleDouble2
Long Long, , DecimalDoubleSingle2
ULong ULong, , DecimalDoubleSingle2
Десятичное число Decimal, SingleDouble2
Один Single, Double
Двойной Double
Любой перечислимый тип (Перечисление) Его базовый целочисленный тип и любой тип, к которому расширяется базовый тип.
Char Char, String
Char массив Char Массива String
Любой тип Объект
Любой производный тип Любой базовый тип, от которого он является производным 3.
Любой тип Любой интерфейс, который он реализует.
Nothing Любой тип данных или тип объекта.

1 По определению каждый тип данных расширяется.

2 Преобразования из Integer, , UIntegerили LongULongв или DoubleSingleDecimal могут привести к потере точности, но никогда не потери величины. В этом смысле они не несут потери информации.

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  

См. также