Compartilhar via


Conversões implícitas e explícitas (Visual Basic)

Uma conversão implícita não requer nenhuma sintaxe especial no código-fonte. No exemplo a seguir, o Visual Basic converte implicitamente o valor de k em um valor de ponto flutuante de precisão única antes de atribuí-lo a 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

Uma conversão explícita usa uma palavra-chave de conversão de tipo. O Visual Basic fornece várias palavras-chave, que coagim uma expressão entre parênteses ao tipo de dados desejado. Essas palavras-chave agem como funções, mas o compilador gera o código embutido, portanto, a execução é um pouco mais rápida do que com uma chamada de função.

Na extensão seguinte do exemplo anterior, a CInt palavra-chave converte o valor de q novamente para um inteiro antes de atribuir a 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).

Palavras-chave de conversão

A tabela a seguir mostra as palavras-chave de conversão disponíveis.

Palavra-chave de conversão de tipo Converte uma expressão em tipo de dados Tipos de dados permitidos de expressão a serem convertidos
CBool Tipo de dados booliano Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), String, Object
CByte Tipo de Dados Byte Qualquer tipo numérico (incluindo SByte tipos enumerados), Boolean, , StringObject
CChar Tipo de dados Char String, Object
CDate Tipo de Dados de Data String, Object
CDbl Tipo de dados duplo Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CDec Tipo de dados decimal Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CInt Tipo de dados inteiro Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CLng Tipo de Dados Long Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CObj Tipo de Dados de Objeto Qualquer tipo
CSByte Tipo de dados SByte Qualquer tipo numérico (incluindo Byte tipos enumerados), Boolean, , StringObject
CShort Tipo de dados curto Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CSng Tipo de dados único Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CStr Tipo de dados de cadeia de caracteres Qualquer tipo numérico (incluindo Byte, SByte e tipos enumerados), Boolean, Char, matriz Char, Date, Object
CType Tipo especificado após a vírgula (,) Ao converter para um tipo de dados elementar (incluindo uma matriz de um tipo elementar), os mesmos tipos permitidos são os permitidos pela palavra-chave de conversão correspondente.

Ao converter em um tipo de dados composto, as interfaces que ele implementa e as classes das quais ele herda

Ao converter em uma classe ou estrutura na qual você sobrecarregou CType, essa mesma classe ou estrutura
CUInt Tipo de dados UInteger Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CULng Tipo de Dados ULong Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject
CUShort Tipo de Dados UShort Qualquer tipo numérico (incluindo Byte, SBytee tipos enumerados), Boolean, , StringObject

O operador CType

O Operador CType opera em dois argumentos. A primeira é a expressão a ser convertida e a segunda é o tipo de dados de destino ou a classe de objeto. Observe que o primeiro argumento deve ser uma expressão, não um tipo.

CType é uma função embutida, o que significa que o código compilado faz a conversão, muitas vezes sem gerar uma chamada de função. Isso melhora o desempenho.

Para obter uma comparação de CType com as outras palavras-chave de conversão de tipo, consulte o Operador DirectCast e o Operador TryCast.

Tipos elementares

O exemplo a seguir demonstra o uso de CType.

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

Tipos compostos

Você pode usar CType para converter valores em tipos de dados compostos, bem como em tipos elementares. Você também pode usá-la para coagir uma classe de objeto ao tipo de uma de suas interfaces, como no exemplo a seguir.

' 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)

Tipos de matriz

CType também pode converter tipos de dados de matriz, como no exemplo a seguir.

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

Para obter mais informações e um exemplo, consulte Conversões de Matriz.

Tipos que definem CType

Você pode definir CType em uma classe ou estrutura definida. Isso permite que você converta valores para o tipo da sua classe ou estrutura e vice-versa. Para obter mais informações e um exemplo, consulte Como definir um operador de conversão.

Observação

Os valores usados com uma palavra-chave de conversão devem ser válidos para o tipo de dados de destino ou ocorrerá um erro. Por exemplo, se você tentar converter um Long para um Integer, o valor do Long deve estar dentro do intervalo válido para o tipo de dados Integer.

Cuidado

Especificar CType para converter um tipo de classe em outro falhará em tempo de execução se o tipo de origem não derivar do tipo de destino. Essa falha gera uma exceção InvalidCastException .

No entanto, se um dos tipos for uma estrutura ou classe que você definiu e se você dispuser de CType nessa estrutura ou classe, uma conversão pode ser bem-sucedida se atender aos requisitos de sua CType. Veja como definir um operador de conversão.

A execução de uma conversão explícita também é conhecida como conversão de uma expressão para um determinado tipo de dados ou classe de objeto.

Consulte também