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, Double2
UInteger UInteger, Long, ULong, Decimal, Single, Double2
Long Long, Decimal, Single, Double2
ULong ULong, Decimal, Single, Double2
Decimal Decimal, Single, Double2
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 Data

  • Conversõ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  

Confira também