Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una consideración importante con una conversión de tipos es si el resultado de la conversión está dentro del intervalo 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 convierte de un tipo entero a Decimal
o de Char
a String
.
Una conversión de restricción cambia un valor a un tipo de datos que podría no ser capaz de contener algunos de los valores posibles. Por ejemplo, un valor fraccionario se redondea cuando se convierte en un tipo entero y un tipo numérico al que se convierte 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 dato | Amplía a los tipos de datos 1 |
---|---|
SByte |
SByte , Short , Integer , Long , Decimal , , Single Double |
byte de |
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 , , Double Single 2 |
Largo |
Long , Decimal , , Double Single 2 |
ULong |
ULong , Decimal , , Double Single 2 |
Decimal |
Decimal , , Single Double 2 |
único |
Single , Double |
Doble | Double |
Cualquier tipo enumerado (Enum) | Su tipo entero subyacente y cualquier tipo al que se amplíe el tipo subyacente. |
Carbonizar |
Char , String |
Char arreglo |
Cadena Char , String |
Cualquier tipo | Objeto |
Cualquier tipo derivado | Cualquier tipo base del que se deriva 3. |
Cualquier tipo | Cualquier interfaz que implemente. |
Nada | Cualquier tipo de datos o tipo de objeto. |
1 Por definición, cada tipo de datos se amplía a sí mismo.
2 Conversiones de Integer
, UInteger
, Long
, ULong
o Decimal
a Single
o Double
podrían dar lugar a la pérdida de precisión, pero nunca a la 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 califica como una instancia del tipo base. En la dirección opuesta, el tipo base no contiene ningún nuevo miembro definido por el tipo derivado.
Las conversiones de ampliación siempre se realizan correctamente en tiempo de ejecución, nunca se produce ninguna 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)
Conversiones en cualquier dirección entre booleano y cualquier tipo numérico
Conversiones de cualquier tipo numérico a cualquier tipo enumerado (
Enum
)Conversiones en cualquier dirección entre String y cualquier tipo numérico,
Boolean
, o DateConversiones de un tipo de datos o un tipo de objeto a 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 va a convertir. 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 al tipo de datos de destino sin errores o pérdida de datos. Por ejemplo, si tiene un String
que sabe que contiene "True" o "False", puede usar la CBool
palabra clave 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 una función CType para que actúe como operador de conversión hacia o desde esa clase o estructura, puede producir cualquier excepción que CType
considere adecuada. Además, podría CType
llamar a funciones de Visual Basic o métodos de .NET Framework, que a su vez podrían producir una variedad 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 a su clase base, pero el objeto al que ambas variables apuntan ahora no se modifican.
' 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