Compartir a través de


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 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 Decimalo 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, , SingleDouble
byte de Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, , SingleDouble
short Short, Integer, Long, Decimal, , Single, Double
UShort UShort, Integer, UInteger, Long, ULong, Decimal, , SingleDouble
Entero Integer, Long, Decimal, Single, Double2
UInteger UInteger, Long, ULong, Decimal, , DoubleSingle2
Largo Long, Decimal, , DoubleSingle2
ULong ULong, Decimal, , DoubleSingle2
Decimal Decimal, , SingleDouble2
ú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 Date

  • Conversiones 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  

Consulte también