Conversões de Widening e Narrowing (Visual Basic)
Uma consideração importante com uma conversão de tipo é se o resultado da conversão está dentro do intervalo do tipo de dados de destino.
Uma conversão de expansão altera um valor para um tipo de dados que pode permitir qualquer valor possível dos dados originais. As conversões de expansão preservam o valor de origem, mas podem alterar sua representação. Isso ocorrerá se você converter de um tipo integral para Decimal
ou de Char
para String
.
Uma conversão de restrição altera um valor para um tipo de dados que pode não ser capaz de manter alguns dos valores possíveis. Por exemplo, um valor fracionário é arredondado quando ele é convertido em um tipo integral e um tipo numérico sendo convertido para Boolean
é reduzido a um True
ou False
.
Conversões de expansão
A tabela a seguir mostra as conversões de expansão padrão.
Tipo de dados | Expande para os tipos de dados 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 |
Inteiro | Integer , Long , Decimal , Single , Double 2 |
UInteger | UInteger , Long , ULong , Decimal , Single , Double 2 |
Long | Long , Decimal , Single , Double 2 |
ULong | ULong , Decimal , Single , Double 2 |
Decimal | Decimal , Single , Double 2 |
Single | Single , Double |
Double | Double |
Qualquer tipo enumerado (Enumerado) | Seu tipo integral subjacente e qualquer tipo ao qual o tipo subjacente é expandido. |
Char | Char , String |
Matriz Char |
Char matriz, String |
Qualquer tipo | Objeto |
Qualquer tipo derivado | Qualquer tipo base do qual ele é derivado 3. |
Qualquer tipo | Qualquer interface implementada. |
Nothing | Qualquer tipo de dados ou tipo de objeto. |
1 Por definição, cada tipo de dados é ampliado para si mesmo.
2 Conversões de Integer
, UInteger
, Long
, ULong
ou Decimal
para Single
ou Double
pode resultar em perda de precisão, mas nunca em perda de magnitude. Nesse sentido, eles não incorrem em perda de informações.
3 Pode parecer surpreendente que uma conversão de um tipo derivado para um de seus tipos base seja expansão. A justificativa é que o tipo derivado contém todos os membros do tipo base, portanto, ele se qualifica como uma instância do tipo base. Na direção oposta, o tipo base não contém nenhum novo membro definido pelo tipo derivado.
As conversões de expansão sempre são bem-sucedidas em tempo de execução e nunca incorrem em perda de dados. Você sempre pode executá-las implicitamente, se a Instrução Opção Estrita define a opção de verificação de tipo para On
ou para Off
.
Conversões de redução
As conversões de restrição padrão incluem o seguinte:
As direções inversas das conversões de expansão na tabela anterior (exceto que cada tipo é expandido para si mesmo)
Conversões em qualquer direção entre booliano e qualquer tipo numérico
Conversões de qualquer tipo numérico para qualquer tipo enumerado (
Enum
)Conversões em qualquer direção entre cadeia de caracteres e qualquer tipo numérico,
Boolean
ou DataConversões de um tipo de dados ou tipo de objeto para um tipo derivado dele
As conversões de restrição nem sempre são bem-sucedidas em tempo de execução e podem falhar ou incorrer em perda de dados. Ocorrerá um erro se o tipo de dados de destino não puder receber o valor que está sendo convertido. Por exemplo, uma conversão numérica pode resultar em um estouro. O compilador não permite que você execute conversões de restrição implicitamente, a menos que a Instrução Option Strict defina a opção de verificação de tipo como Off
.
Observação
O erro de conversão de restrição é suprimido para conversões dos elementos em uma coleção For Each…Next
para a variável de controle de loop. Para obter mais informações e exemplos, consulte a seção "Conversões de restrição" em Para cada... Próxima instrução.
Quando usar conversões de restrição
Você usa uma conversão de restrição quando sabe que o valor de origem pode ser convertido no tipo de dados de destino sem erro ou perda de dados. Por exemplo, se você tiver um String
que você sabe que contém "True" ou "False", você poderá usar a palavra-chave CBool
para converter em Boolean
.
Exceções durante a conversão
Como as conversões de expansão sempre são bem-sucedidas, elas não geram exceções. As conversões de restrição, quando elas falham, geralmente geram as seguintes exceções:
InvalidCastException — se nenhuma conversão for definida entre os dois tipos
OverflowException — (somente tipos integrais) se o valor convertido for muito grande para o tipo de destino
Se uma classe ou estrutura definir uma Função CType para servir como um operador de conversão para ou dessa classe ou estrutura, isso poderá gerar qualquer exceção que CType
considerar apropriada. Além disso, isso CType
pode chamar funções do Visual Basic ou métodos .NET Framework, o que, por sua vez, pode gerar uma variedade de exceções.
Alterações durante conversões de tipo de referência
Uma conversão de um tipo de referência copia apenas o ponteiro para o valor. O valor em si não é copiado nem alterado de forma alguma. A única coisa que pode alterar é o tipo de dados da variável que contém o ponteiro. No exemplo a seguir, o tipo de dados é convertido da classe derivada em sua classe base, mas o objeto para o qual ambas as variáveis agora apontam está inalterado.
' 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