Conversiones de ampliación y de restricción (Visual Basic)

Una consideración importante con una conversión de tipos es si el resultado de la conversión está dentro del rango del tipo de datos de destino.

Una conversión de ampliación cambia un valor a un tipo de datos que puede permitir cualquier valor posible de los datos originales. Las conversiones de ampliación conservan el valor de origen, pero pueden cambiar su representación. Esto ocurre si se convierte un tipo entero en Decimal, o Char en String.

Una conversión de restricción cambia un valor a un tipo de datos que no pueda mantener algunos de los valores posibles. Por ejemplo, un valor fraccionario se redondea cuando se convierte en un tipo entero, y un tipo numérico que se convierte en Boolean se reduce a True o False.

conversiones de ampliación

En la tabla siguiente se muestran las conversiones de ampliación estándar.

Tipo de datos Se amplía a tipos de datos 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
Entero 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
Cualquier tipo enumerado (Enum) Su tipo entero subyacente y cualquier tipo al que se amplíe el tipo subyacente.
Char Char, String
Matriz Char Char (matriz), String
Cualquier tipo Object
Cualquier tipo derivado Cualquier tipo base del que se deriva 3.
Cualquier tipo Cualquier interfaz que implementa.
Nothing Cualquier tipo de datos o tipo de objeto.

1 Por definición, cada tipo de datos se amplía a sí mismo.

2 Las conversiones de Integer, UInteger, Long, ULong o Decimal en Single o Double pueden dar lugar a una pérdida de precisión, pero nunca a una pérdida de magnitud. En este sentido, no incurren en pérdida de información.

3 Puede parecer sorprendente que una conversión de un tipo derivado en uno de sus tipos base sea de ampliación. La justificación es que el tipo derivado contiene todos los miembros del tipo base, por lo que se considera una instancia del tipo base. A la inversa, el tipo base no contiene ningún miembro nuevo definido por el tipo derivado.

Las conversiones de ampliación siempre se realizan correctamente en tiempo de ejecución y nunca incurren en pérdida de datos. Siempre pueden realizarse implícitamente, tanto si la instrucción Option Strict establece el modificador de comprobación de tipos en On como en Off.

conversiones de restricción

Las conversiones de restricción estándar incluyen las siguientes:

  • Las direcciones inversas de las conversiones de ampliación de la tabla anterior (excepto que cada tipo se amplía a sí mismo)

  • Las conversiones en cualquier dirección entre Boolean y cualquier tipo numérico

  • Las conversiones de cualquier tipo numérico en cualquier tipo enumerado (Enum)

  • Las conversiones en cualquier dirección entre String y cualquier tipo numérico, Boolean o Date

  • Las conversiones de un tipo de datos o tipo de objeto en un tipo derivado de él

Las conversiones de restricción no siempre se realizan correctamente en tiempo de ejecución, y pueden producir errores o incurrir en pérdida de datos. Se produce un error si el tipo de datos de destino no puede recibir el valor que se está convirtiendo. Por ejemplo, una conversión numérica puede dar lugar a un desbordamiento. El compilador no permite realizar conversiones de restricción implícitamente a menos que la instrucción Option Strict establezca el modificador de comprobación de tipos en Off.

Nota

El error de conversión de restricción se suprime en las conversiones de los elementos de una colección For Each…Next a la variable de control de bucle. Para obtener más información y ejemplos, vea la sección "Conversiones de restricción" de Instrucción For Each...Next.

Uso de conversiones de restricción

Use una conversión de restricción cuando sepa que el valor de origen se puede convertir en el tipo de datos de destino sin errores ni pérdida de datos. Por ejemplo, si tiene un valor String que sabe que contiene "True" o "False", puede usar la palabra clave CBool para convertirlo en Boolean.

Excepciones durante la conversión

Dado que las conversiones de ampliación siempre se realizan correctamente, no inician excepciones. Las conversiones de restricción, cuando generan errores, suelen iniciar las siguientes excepciones:

  • InvalidCastException: si no se define ninguna conversión entre los dos tipos

  • OverflowException: (solo tipos enteros) si el valor convertido es demasiado grande para el tipo de destino

Si una clase o estructura define CType (Función) para que actúe como operador de conversión hacia o desde esa clase o estructura, que CType pueda iniciar cualquier excepción se considera adecuado. Además, CType podría llamar a funciones de Visual Basic o métodos de .NET Framework, lo que a su vez podría iniciar una serie de excepciones.

Cambios durante las conversiones de tipos de referencia

Una conversión de un tipo de referencia copia solo el puntero en el valor. El propio valor no se copia ni cambia de ninguna manera. Lo único que puede cambiar es el tipo de datos de la variable que contiene el puntero. En el ejemplo siguiente, el tipo de datos se convierte de la clase derivada en su clase base, pero el objeto al que ambas variables apuntan ahora no se modifica.

' 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  

Consulte también