Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 ampliação altera um valor para um tipo de dados que pode permitir qualquer valor possível dos dados originais. A ampliação das conversões preserva o valor de origem, mas pode alterar sua representação. Isso ocorre se você converter de um tipo integral para Decimal
, ou de Char
para String
.
Uma conversão de estreitamento altera um valor para um tipo de dados que pode não ser capaz de conter alguns dos valores possíveis. Por exemplo, um valor fracionário é arredondado quando é convertido em um tipo integral, e um tipo numérico que está sendo convertido em Boolean
é reduzido a um True
ou False
.
Ampliando as conversões
A tabela a seguir mostra as conversões de alargamento padrão.
Tipo de dados | Alarga para tipos de dados 1 |
---|---|
SByte |
SByte , Short , Integer , Long , Decimal , Single , Double |
Byte |
Byte , Short , , UShort , Integer , UInteger Long , ULong , Decimal Single ,Double |
Curto |
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 |
Longo |
Long , Decimal , Single , Double 2 |
ULong |
ULong , Decimal , Single , Double 2 |
Decimal |
Decimal , Single , Double 2 |
Solteiro |
Single , Double |
`Duplo` | Double |
Qualquer tipo enumerado (Enum) | O seu tipo integral subjacente e qualquer tipo ao qual o tipo subjacente se expanda. |
Char |
Char , String |
Char matriz |
Char matriz, String |
Qualquer tipo | Objeto |
Qualquer tipo derivado | Qualquer tipo de base a partir do qual é derivado 3. |
Qualquer tipo | Qualquer interface que ele implemente. |
Nada | Qualquer tipo de dados ou tipo de objeto. |
1 Por definição, cada tipo de dados se amplia para si mesmo.
2 Conversões de Integer
, UInteger
, Long
, ULong
, ou Decimal
para Single
ou Double
podem resultar em perda de precisão, mas nunca em perda de magnitude. Neste sentido, não incorrem em perda de informação.
3 Pode parecer surpreendente que uma conversão de um tipo derivado para um dos seus tipos de base esteja a alargar-se. 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 novos membros definidos pelo tipo derivado.
As conversões ampliadas são sempre bem-sucedidas em tempo de execução e nunca acarretam perda de dados. Você pode sempre realizá-los implicitamente, quer a instrução Option Strict defina a opção de verificação de tipo como On
ou Off
.
Estreitando conversões
As conversões de estreitamento padrão incluem o seguinte:
As direções inversas das conversões de ampliação na tabela anterior (com exceção de que cada tipo se amplia para si próprio)
Conversões em qualquer direção entre booleano e qualquer tipo numérico
Conversões de qualquer tipo numérico para qualquer tipo enumerado (
Enum
)Conversões em qualquer direção entre String 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 estreitamento nem sempre são bem-sucedidas durante a execução e podem falhar ou causar 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 overflow. O compilador não permite que você execute conversões de estreitamento implicitamente, a menos que a instrução Option Strict defina o interruptor de verificação de tipo como Off
.
Observação
O erro de estreitamento-conversão é suprimido para conversões dos elementos em uma For Each…Next
coleção para a variável de controle de loop. Para obter mais informações e exemplos, consulte a seção "Estreitando conversões" em Para cada um... Próxima declaração.
Quando usar o estreitamento de conversões
Você usa uma conversão de estreitamento quando sabe que o valor de origem pode ser convertido para o tipo de dados de destino sem erro ou perda de dados. Por exemplo, se tiveres um String
que sabes que contém "True" ou "False", podes usar CBool
keyword para convertê-lo em Boolean
.
Exceções durante a conversão
Como as conversões de ampliação sempre são bem-sucedidas, elas não lançam exceções. O estreitamento de conversões, quando falham, geralmente gera as seguintes exceções:
InvalidCastException — se não for definida qualquer conversão entre os dois tipos
OverflowException — (apenas tipos integrais) se o valor convertido for demasiado grande para o tipo de destino
Se uma classe ou estrutura define uma Função CType para servir como um operador de conversão de ou para essa classe ou estrutura, isso CType
pode lançar qualquer exceção que considere apropriada. Além disso, CType
pode chamar funções do Visual Basic ou métodos do .NET Framework, que, por sua vez, podem 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 mudar é o tipo de dados da variável que contém o ponteiro. No exemplo a seguir, o tipo de dados é convertido da classe derivada para sua classe base, mas o objeto para o qual ambas as variáveis apontam agora permanece 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