Compartir a través de


Conversiones de tipos (Guía de programación de C#)

Dado que C# se escribe estáticamente en tiempo de compilación, después de declarar una variable, no se puede declarar de nuevo ni asignar un valor de otro tipo a menos que ese tipo se pueda convertir implícitamente en el tipo de la variable. Por ejemplo, string no se puede convertir implícitamente en int. Por lo tanto, después de declarar i como , intno se puede asignar la cadena "Hello" a ella, como se muestra en el código siguiente:

int i;

// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";

Sin embargo, a veces es posible que tenga que copiar un valor en una variable o un parámetro de método de otro tipo. Por ejemplo, es posible que tenga una variable entera que necesite pasar a un método cuyo parámetro esté escrito como double. O bien, es posible que tenga que 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 ninguna sintaxis especial porque la conversión siempre se realiza correctamente y no se pierde ningún dato. Entre los ejemplos se incluyen conversiones de tipos enteros más pequeños a más grandes, conversiones de clases derivadas a clases base y conversiones de intervalo.

  • Conversiones explícitas: las conversiones explícitas requieren una expresión Cast. El uso de un casting es necesario cuando se puede perder información durante la conversión o cuando la conversión puede no realizarse con éxito por otras razones. Entre los ejemplos típicos se incluyen la conversión numérica a un tipo que tiene menos precisión o un intervalo menor y la conversión de una instancia de clase base a una clase derivada.

  • Conversiones definidas por el usuario: las conversiones definidas por el usuario usan métodos especiales que se pueden definir para habilitar conversiones explícitas e implícitas entre tipos personalizados que no tienen una relación de clase derivada de clase base. Para obtener más información, vea Operadores de conversión definidos por el usuario.

  • Conversiones con clases auxiliares: para convertir entre tipos no compatibles, como enteros y System.DateTime objetos, o cadenas hexadecimales y matrices de bytes, puede usar la System.BitConverter clase, la System.Convert clase y los Parse métodos de los tipos numéricos integrados, como Int32.Parse. Para obtener más información, consulte los artículos siguientes:

  • Cómo convertir una matriz de bytes en un valor int

  • Cómo convertir una cadena en un número

  • Conversión entre cadenas hexadecimales y tipos numéricos

Conversiones implícitas

En el caso de los tipos numéricos integrados, se puede realizar una conversión implícita cuando el valor que se va a almacenar puede caber en la variable sin truncarse ni redondearse. Para los tipos enteros, esta restricción significa que el intervalo del tipo de origen es un subconjunto adecuado del intervalo para el tipo de destino. Por ejemplo, una variable de tipo long (entero de 64 bits) puede almacenar cualquier valor que pueda almacenar un entero (entero de 32 bits). En el ejemplo siguiente, el compilador convierte implícitamente el valor de num a la derecha a un tipo long antes de asignarlo a bigNum.

// Implicit conversion. A 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, consulte la sección Conversiones numéricas implícitas del artículo Conversiones numéricas integradas.

Para los tipos de referencia, siempre existe una conversión implícita de una clase a cualquiera de sus clases o interfaces base directas o indirectas. No es necesaria ninguna sintaxis especial porque una clase derivada siempre contiene todos los miembros de una clase base.

Derived d = new Derived();

// Always OK.
Base b = d;

Conversiones explícitas

Pero 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, que se denomina conversión. Una conversión es una manera de realizar explícitamente la conversión. Indica que estás consciente de que podría ocurrir una pérdida de datos o que la conversión podría fallar en tiempo de ejecución. Para realizar una conversión, especifique el tipo de destino entre paréntesis antes de la expresión que desee convertir. El siguiente programa convierte un valor double en un valor int. El programa no se compilará sin la conversión.

double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234

Para obtener una lista completa de conversiones numéricas explícitas admitidas, consulte la sección Conversiones numéricas explícitas del artículo Conversiones numéricas integradas.

Para los tipos de referencia, se requiere una conversión explícita si es necesario convertir de un tipo base a un tipo derivado:

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 usa como referencia a ese objeto. Para obtener más información, vea Polimorfismo.

Excepciones de conversión de tipos en tiempo de ejecución

En algunas conversiones de tipos de referencia, el compilador no puede determinar si una conversión será válida. Es posible que una operación de conversión que se compile correctamente produzca un error en tiempo de ejecución. Como se muestra en el ejemplo siguiente, una conversión de tipos que produce un error en tiempo de ejecución hace que se produzca un InvalidCastException.

Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time

La conversión explícita del argumento a a un Reptile implica una suposición peligrosa. Es más seguro no realizar suposiciones, sino comprobar el tipo. C# proporciona el operador is para permitir probar la compatibilidad antes de realizar una conversión. Para obtener más información, consulte Cómo realizar conversiones de manera segura utilizando la coincidencia de patrones y los operadores as y is.

Especificación del lenguaje C#

Para obtener más información, consulte la sección Conversiones de la especificación del lenguaje C#.

Consulte también