Compartir a través de


Conversión explícita

Actualización: noviembre 2007

La conversión explícita es un mecanismo específico del lenguaje para realizar conversiones. Algunos compiladores necesitan la conversión explícita para admitir las conversiones de restricción.

Aunque la mayoría de los lenguajes cuyo destino es Common Language Runtime admiten la conversión explícita, el mecanismo exacto es distinto de unos lenguajes a otros. Algunos lenguajes cuyo destino es Common Language Runtime pueden requerir que una conversión concreta se realice explícitamente, mientras que otros pueden permitir que la misma conversión se realice implícitamente. De igual forma, algunos lenguajes podrían requerir que una conversión concreta se realizara explícitamente en determinadas condiciones (por ejemplo, si se activa Option Strict en Visual Basic), pero en otras condiciones (por ejemplo, si se desactiva Option Strict en Visual Basic) podrían realizar la conversión de forma implícita. Vea la documentación del lenguaje que esté utilizando para obtener más información sobre la conversión explícita.

En algunos lenguajes, como C# y C++, la conversión explícita se realiza mediante conversiones de tipos. La conversión con moldes se produce cuando a una conversión se le pone un prefijo de un tipo de dato que define el tipo de conversión que se desea realizar. En otros lenguajes, como Visual Basic, la conversión explícita se realiza llamando a una función de conversión. En Visual Basic, la función CType o una de las funciones de conversión de tipo específica, como CStr o CInt, se utiliza para permitir conversiones explícitas de tipos de datos que no se permiten de forma implícita.

La mayoría de los compiladores permiten realizar conversiones explícitas de manera comprobada o no comprobada. Cuando se realiza una conversión comprobada, se produce una excepción OverflowException si el valor del tipo que se está convirtiendo está fuera del intervalo del tipo de destino. Si se realiza una conversión no comprobada en las mismas circunstancias, es posible que el valor convertido no produzca una excepción, pero no se podrá determinar con exactitud cuál será el comportamiento y se puede obtener como resultado un valor incorrecto.

Nota:

En C#, las conversiones comprobadas se pueden realizar utilizando la palabra clave checked junto con el operador de conversión de tipo o especificando la opción del compilador /checked+. Por el contrario, las conversiones no comprobadas se pueden realizar utilizando la palabra clave unchecked junto con el operador de conversión de tipo o especificando la opción del compilador /checked-. De forma predeterminada, las conversiones explícitas no se comprueban. En Visual Basic, las conversiones comprobadas se pueden realizar desactivando la casilla Quitar comprobaciones de desbordamiento con enteros en el cuadro de diálogo Configuración de compilador avanzada del proyecto o especificando la opción del compilador /removeintchecks-. Por el contrario, las conversiones no comprobadas se pueden realizar activando la casilla Quitar comprobaciones de desbordamiento con enteros en el cuadro de diálogo Configuración de compilador avanzada del proyecto o especificando la opción del compilador /removeintchecks+. De forma predeterminada, las conversiones explícitas se comprueban.

En el ejemplo siguiente, donde se intenta convertir Int32.MaxValue en un valor Byte, se muestra una conversión de tipo de C# que no se comprueba. Tenga en cuenta que, aunque el valor entero está fuera del intervalo del tipo de datos Byte de destino, la conversión no produce una excepción OverflowException.

// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
   byte myByte = (byte)myInt;
   Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
   Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}   
// The value of MyByte is 255, the maximum value of a Byte.
// No overflow exception is thrown.

En el siguiente ejemplo de código se muestra una conversión explícita en la que se utiliza la función CByte comprobada de Visual Basic y la conversión comprobada de C# con la palabra clave checked. En este ejemplo se intenta convertir Int32.MaxValue en un valor Byte. Sin embargo, dado que Int32.MaxValue está fuera del intervalo del tipo de datos Byte, se produce una excepción OverflowException.

' The integer value is set to 2147483647.
Dim myInt As Integer = Integer.MaxValue
Try
   Dim myByte As Byte = CByte(myInt)
   Console.WriteLine("The byte value is {0}.", myByte)
Catch e As OverflowException
   Console.WriteLine("Unable to convert {0} to a byte.", myInt)
End Try   
' Attempting to convert Int32.MaxValue to a Byte 
' throws an OverflowException.
// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
   byte myByte = checked ((byte) myInt);
   Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
   Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}   
// Attempting to convert Int32.MaxValue to a Byte 
// throws an OverflowException.

Observe que la conversión explícita puede generar resultados diferentes en los distintos lenguajes y que estos resultados pueden diferir en el comportamiento del método Convert correspondiente. Consulte la documentación del lenguaje que esté utilizando para obtener más información sobre el comportamiento de la conversión explícita. Por ejemplo, si se convierte un valor Double en un valor Int32 en Visual Basic utilizando la función CInt, el valor se redondea. Sin embargo, si se realiza la misma conversión utilizando la conversión explícita en C#, se pierden los valores decimales. En el siguiente ejemplo de código se utiliza la conversión explícita para convertir un valor double en un valor entero.

Dim myDouble As Double = 42.72
Dim myInt As Integer = CInt(myDouble)
Console.WriteLine(myInt)
' myInt has a value of 43.
Double myDouble = 42.72;
int myInt = checked ((int)myDouble);
Console.WriteLine(myInt);
// myInt has a value of 42.

Vea también

Referencia

System.Convert

Otros recursos

Convertir tipos