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

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

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

Преобразование сужения изменяет тип данных значения на тип, который не сможет содержать некоторые возможные значения. Например, дробное значение округляется при преобразовании в целочисленный тип, а числовой тип, в 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, Long, Decimal, Single, Double
UShort UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
Integer Integer, Long, Decimal, SingleDouble2
UInteger UInteger, Long, ULong, Decimal, SingleDouble2
Long Long, Decimal, SingleDouble2
ULong ULong, Decimal, SingleDouble2
Десятичное число Decimal, SingleDouble2
Один Single, Double
Double Double
Любой перечислимый тип (перечисление) Его базовый целочисленный тип и любой тип, к которому расширяется базовый тип.
Char Char, String
Массив Char Char Массива String
Любой тип Объект
Любой производный тип Любой базовый тип, от которого он является производным 3.
Любой тип Любой интерфейс, который он реализует.
Nothing Любой тип данных или тип объекта.

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

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

3 Может показаться удивительным, что преобразование из производного типа в один из его базовых типов расширяется. Обоснование заключается в том, что производный тип содержит все члены базового типа, поэтому он квалифисируется как экземпляр базового типа. В противоположном направлении базовый тип не содержит новых элементов, определенных производным типом.

Расширение преобразований всегда выполняется успешно во время выполнения и никогда не теряйте данные. Вы всегда можете выполнять их неявно, независимо от того, задает ли оператор Option Strict параметр проверки типа значение или On значение Off.

сужающие преобразования

Стандартные сужающие преобразования включают следующее:

  • Обратные направления расширяющихся преобразований в предыдущей таблице (за исключением того, что каждый тип расширяется до самого себя)

  • Преобразования в любом направлении между логическим и любым числовым типом

  • Преобразования из любого числового типа в любой перечислимый тип (Enum)

  • Преобразования в любом направлении между Строкой и любым числовым типом, Booleanили датой

  • Преобразования из типа данных или типа объекта в тип, производный от него

Сужение преобразований не всегда выполняется во время выполнения и может привести к сбою или потере данных. Ошибка возникает, если целевой тип данных не может получить преобразуемое значение. Например, числовое преобразование может привести к переполнению. Компилятор не позволяет выполнять сужающие преобразования неявно, если оператор Option Strict не устанавливает переключатель Offпроверки типа.

Примечание

Ошибка сужения преобразования подавляется для преобразования элементов в коллекцию в For Each…Next переменную управления циклом. Дополнительные сведения и примеры см. в разделе "Сужение преобразований" раздела For Each... Следующая инструкция.

Когда следует использовать сужающие преобразования

Преобразование сужания используется, если известно, что исходное значение можно преобразовать в целевой тип данных без ошибок или потери данных. Например, если вы 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  

См. также раздел