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 , 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 |
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 DateLas 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