Поделиться через


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

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

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

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

Расширение преобразований

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

Тип данных Расширение до типов данных 1
SByte SByte, Short, IntegerLongDecimalSingleDouble
Байт Byte, Short, UShortIntegerUIntegerLongULongDecimalSingleDouble
short Short, , IntegerLongDecimalSingle,Double
UShort UShort, Integer, UIntegerLongULongDecimalSingleDouble
Целое число Integer, , LongDecimalSingle, Double2
UInteger UInteger, Long, ULongDecimalSingleDouble
Длинный Long, , DecimalSingleDouble 2
ULong ULong, , DecimalSingleDouble 2
Десятичное число Decimal, SingleDouble2
Один 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  

См. также