Conversiones de tipos (Guía de programación de C#)
Actualización: Julio de 2008
Dado que a C# se le asignan tipos estáticos en tiempo de compilación, después de declarar una variable, no se puede volver a declarar ni tampoco utilizar para almacenar valores de otro tipo, a menos que dicho tipo pueda convertirse en el tipo de la variable. Por ejemplo, no existe conversión de un entero a una cadena arbitraria cualquiera. Por lo tanto, después de declarar i como entero, no puede asignarle la cadena "Hello", como se muestra en el código siguiente.
int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"
Sin embargo, en ocasiones puede que sea necesario copiar un valor en un parámetro de método o variable de otro tipo. Por ejemplo, puede que tenga una variable de tipo entero que deba pasar a un método cuyo parámetro es de tipo double. O bien, puede que necesite asignar una variable de clase a una variable de un tipo de interfaz. Estos tipos de operaciones se denominan conversiones de tipos. En C#, puede realizar los siguientes tipos de conversiones:
Conversiones implícitas: no se requiere una sintaxis especial porque la conversión se realiza con seguridad de tipos y no se perderán datos. Entre los ejemplos se incluyen las conversiones de tipos enteros de menor a mayor y las conversiones de clases derivadas en clases base.
Conversiones explícitas (conversiones de tipos): las conversiones explícitas requieren un operador de conversión. Las variables de origen y destino son compatibles, pero existe el riesgo de perder datos debido a que el tipo de la variable de destino es más pequeño que (o es una clase base de) la variable de origen.
Conversiones definidas por el usuario: las conversiones definidas por el usuario se realizan a través de métodos especiales que puede definir para habilitar las conversiones explícitas e implícitas entre tipos personalizados que no tienen una relación de clase base-clase derivada. Para obtener más información, vea Operadores de conversión (Guía de programación de C#).
Conversiones con clases auxiliares: para realizar conversiones entre tipos no compatibles, como los enteros y los objetos System.DateTime, o bien cadenas hexadecimales y matrices de bytes, puede utilizar la clase System.BitConverter, la clase System.Convert y los métodos Parse de los tipos numéricos integrados, como Int32.Parse. Para obtener más información, vea Cómo: Convertir una matriz de bytes en un valor int (Guía de programación de C#), Cómo: Convertir una cadena en un valor int (Guía de programación de C#) y Cómo: Convertir cadenas hexadecimales en tipos numéricos (Guía de programación de C#).
Conversiones implícitas
En los tipos numéricos integrados, puede realizarse una conversión implícita cuando el valor que se va a almacenar puede ajustarse a la variable sin necesidad de truncamiento o redondeo. Por ejemplo, una variable de tipo longlong (Referencia de C#) (entero de 8 bytes) puede almacenar cualquier valor que pueda almacenar a su vez un elemento intint (Referencia de C#) (4 bytes en un equipo de 32 bits). En el ejemplo siguiente, el compilador convierte implícitamente el valor de la derecha en un tipo long antes de asignarlo a bigNum.
// Implicit conversion. num long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
Para obtener una lista completa de todas las conversiones numéricas implícitas, vea Tabla de conversiones numéricas implícitas (Referencia de C#).
En los tipos de referencia, siempre existe una conversión implícita desde una clase a cualquiera de sus interfaces o clases base directas o indirectas. No se requiere una sintaxis especial, ya que una clase derivada siempre contiene todos los miembros de una clase base.
Derived d = new Derived();
Base b = d; // Always OK.
Conversiones explícitas
Sin embargo, si no se puede realizar una conversión sin riesgo de perder información, el compilador requiere que se realice una conversión explícita, denominada conversión de tipo. Una conversión de tipo es una manera de informar al compilador de forma explícita de que pretende realizar la conversión y que está al tanto de que puede producirse una pérdida de datos. Para realizar una conversión de tipo, especifique entre paréntesis el tipo al que se va a aplicar dicha conversión delante del valor o la variable que se va a convertir. El programa siguiente convierte explícitamente un tipo doubledouble (Referencia de C#) a un tipo intint (Referencia de C#). El programa no se compilará sin el operador de conversión de tipo.
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Para obtener una lista de las conversiones numéricas explícitas permitidas, vea Tabla de conversiones numéricas explícitas (Referencia de C#).
En los tipos de referencia, se requiere una conversión explícita si debe convertir de un tipo base a un tipo derivado:
// Create a new derived type.
Giraffe g = new Giraffe();
// Implicit conversion to base type is safe.
Animal a = g;
// Explicit conversion is required to cast
// back to derived type. Note: This will compile but
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe) a;
Una operación de conversión entre tipos de referencia no cambia el tipo en tiempo de ejecución del objeto subyacente; solo cambia el tipo del valor que se utiliza como referencia para ese objeto. Para obtener más información, vea Polimorfismo (Guía de programación de C#).
Excepciones de las conversiones de tipos en tiempo de ejecución
En algunas conversiones de tipos de referencia, el compilador no puede determinar si será válida una conversión de tipo. Es posible que una operación de conversión de tipo que se compila correctamente provoque un error en tiempo de ejecución. Como se muestra en el ejemplo siguiente, una conversión de tipo que origine un error en tiempo de ejecución hará que se produzca una excepción InvalidCastException.
class Animal
{
public void Eat() { Console.WriteLine("Eating."); }
public override string ToString()
{
return "I am an animal.";
}
}
class Reptile : Animal { }
class Mammal : Animal { }
class UnSafeCast
{
static void Main()
{
Test(new Mammal());
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
static void Test(Animal a)
{
// Cause InvalidCastException at run time
// because Mammal is not convertible to Reptile.
Reptile r = (Reptile)a;
}
}
C# proporciona los operadores is y as, que permiten comprobar la compatibilidad antes de realizar una conversión de tipo. Para obtener más información, vea Cómo: Realizar una conversión segura usando los operadores is y as (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información sobre la conversión y las conversiones de tipos, vea las secciones siguientes en Especificación del lenguaje C#:
7.6.6 Expresiones de conversión
6.1 Conversiones implícitas
6.2 Conversiones explícitas
Vea también
Tareas
Cómo: Convertir una cadena en un valor int (Guía de programación de C#)
Conceptos
Conversión de tipos generalizada
Conversión de tipos exportados
Referencia
Tipos (Guía de programación de C#)
Operador () (Referencia de C#)
Operadores de conversión (Guía de programación de C#)
Historial de cambios
Fecha |
Historial |
Motivo |
---|---|---|
Julio de 2008 |
Se ha agregado contenido a la introducción y a otras partes. |
Corrección de errores de contenido. |