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


Неявные и явные преобразования (Visual Basic)

Неявное преобразование не требует специального синтаксиса в исходном коде. В следующем примере Visual Basic неявно преобразует значение k в число с одинарной точностью с плавающей точкой перед присваиванием q.

Dim k As Integer
Dim q As Double
' Integer widens to Double, so you can do this with Option Strict On.
k = 432
q = k

Явное преобразование использует ключевое слово преобразования типов. Visual Basic предоставляет несколько таких ключевых слов, которые преобразуют выражение в скобках в нужный тип данных. Эти ключевые слова действуют как функции, но компилятор создает встроенный код, поэтому выполнение немного быстрее, чем при вызове функции.

В следующем расширении предыдущего примера ключевое слово CInt преобразует значение q обратно в целое число перед его назначением в k.

' q had been assigned the value 432 from k.
q = Math.Sqrt(q)
k = CInt(q)
' k now has the value 21 (rounded square root of 432).

Ключевые слова конверсии

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

Ключевое слово преобразования типов Преобразует выражение в тип данных Допустимые типы данных выражения для преобразования
CBool Логический тип данных Любой числовой тип (включаяByte, SByteи перечисленные типы), StringObject
CByte Тип данных byte Любой числовой тип (включая SByte и перечисленные типы), Boolean, , StringObject
CChar Тип данных Char String, Object
CDate Тип данных Дата String, Object
CDbl Тип данных Double Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CDec Тип десятичных данных Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CInt Целочисленный тип данных Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CLng Длинный тип данных Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CObj тип данных объекта Любой тип
CSByte Тип данных SByte Любой числовой тип (включая Byte и перечисленные типы), Boolean, , StringObject
CShort Короткий тип данных Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CSng Тип данных Single Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CStr Тип данных строки Любой числовой тип (включая Byte, SByte и перечисленные типы), Boolean, Char, Char массив, Date, Object
CType Тип, указанный после запятой (,) При преобразовании в элементарный тип данных (включая массив элементарного типа), те же типы, что допускаются для соответствующего ключевого слова преобразования.

При преобразовании в составной тип данных учитываются интерфейсы, которые он реализует, и классы, от которых он наследуется.

При преобразовании в класс или структуру, в которой перегружен оператор CType, этот класс или структура
CUInt Тип данных UInteger Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CULng Тип данных ULong Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject
CUShort Тип данных UShort Любой числовой тип (включаяByte, SByteи перечисленные типы), Boolean, , StringObject

Функция CType

Функция CType работает с двумя аргументами. Первое — это выражение, которое необходимо преобразовать, а второй — конечный тип данных или класс объектов. Обратите внимание, что первый аргумент должен быть выражением, а не типом.

CTypeэто встроенная функция, т. е. скомпилированный код делает преобразование часто без создания вызова функции. Это повышает производительность.

Сравнение CType с другими ключевыми словами преобразования типов см. в разделе "Оператор DirectCast" и "Оператор TryCast".

Простые типы

В следующем примере показано использование CType.

k = CType(q, Integer)
' The following statement coerces w to the specific object class Label.
f = CType(w, Label)

Составные типы

Можно использовать CType для преобразования значений в составные типы данных, а также в простые типы. Его также можно использовать для принудительного применения класса объектов к типу одного из его интерфейсов, как показано в следующем примере.

' Assume class cZone implements interface iZone.
Dim h As Object
' The first argument to CType must be an expression, not a type.
Dim cZ As cZone
' The following statement coerces a cZone object to its interface iZone.
h = CType(cZ, iZone)

Типы массивов

CType также может преобразовать типы данных массива, как показано в следующем примере.

Dim v() As classV
Dim obArray() As Object
' Assume some object array has been assigned to obArray.
' Check for run-time type compatibility.
If TypeOf obArray Is classV()
    ' obArray can be converted to classV.
    v = CType(obArray, classV())
End If

Дополнительные сведения и пример см. в разделе "Преобразования массивов".

Типы, определяющие CType

Вы можете определить CType для класса или структуры, которые вы определили. Это позволяет преобразовывать значения в и из типа вашего класса или структуры. Дополнительные сведения и пример см. в разделе "Практическое руководство. Определение оператора преобразования".

Замечание

Значения, используемые с ключевым словом преобразования, должны быть допустимыми для целевого типа данных или возникает ошибка. Например, если вы пытаетесь преобразовать Long в Integer, значение Long должно находиться в допустимом диапазоне для Integer типа данных.

Осторожность

Указание CType для преобразования одного типа класса в другой приводит к ошибке во время выполнения, если исходный тип не является производным от целевого типа. Подобный сбой InvalidCastException вызывает исключение.

Однако если один из типов является определенной структурой или классом, и если вы CType определили для этой структуры или класса, преобразование может завершиться успешно, если оно соответствует требованиям вашего CType. Узнайте , как определить оператор преобразования.

Выполнение явного преобразования также называется приведение выражения к заданному типу данных или классу объектов.

См. также