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
para o valor de um 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 dessas palavras-chave, que forçam 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 a seguir do exemplo anterior, a palavra-chave CInt
converte o valor de q
de volta em um inteiro antes de atribuí-lo 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 regras de conversão disponíveis.
Palavra-chave de conversão de tipo | Converte uma expressão em tipo de dados | Tipos de dados de expressão permitidos para serem convertidos |
---|---|---|
CBool |
Tipo de dados booliano | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), String , Object |
CByte |
Tipo de Dados Byte | Qualquer tipo numérico (incluindo SByte e tipos enumerados), Boolean , String , Object |
CChar |
Tipo de Dados de Caractere | String , Object |
CDate |
Tipo de Dados de Data | String , Object |
CDbl |
Tipo de Dados Duplo | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
CDec |
Tipo de Dados Decimal | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
CInt |
Tipo de Dados Integer | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
CLng |
Tipo de Dados Long | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
CObj |
Tipo de dados Object | Qualquer tipo |
CSByte |
Tipo de Dados SByte | Qualquer tipo numérico (incluindo Byte e tipos enumerados), Boolean , String , Object |
CShort |
Tipo de Dados Short | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
CSng |
Tipo de Dados Simples | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
CStr |
Tipo de Dados String | 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 em um tipo de dados elementar (incluindo uma matriz de um tipo elementar), os mesmos tipos permitidos para a palavra-chave de conversão correspondente Ao converter em um tipo de dados composto, as interfaces que ele implementa e as classes das quais 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 , SByte e tipos enumerados), Boolean , String , Object |
CULng |
Tipo de Dados ULong | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
CUShort |
Tipo de Dados UShort | Qualquer tipo numérico (incluindo Byte , SByte e tipos enumerados), Boolean , String , Object |
Função CType
A Função CType opera em dois argumentos. O primeiro é a expressão a ser convertida, e o segundo é o tipo de dados de destino ou 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 Operador DirectCast e 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 forçar 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 que você definiu. Isso permite que você converta valores de e para o tipo de sua classe ou estrutura. 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
em um Integer
, o valor do Long
deve estar dentro do intervalo válido para o tipo de dados Integer
.
Cuidado
Especificar que CType
converta de um tipo de classe para 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 tiver definido CType
nessa estrutura ou classe, uma conversão poderá ser bem-sucedida se atender aos requisitos do seu 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.