Conversiones de tipos (Guía de programación de C#)Casting and Type Conversions (C# Programming Guide)

Dado que C# tiene tipos estáticos en tiempo de compilación, después de declarar una variable, no se puede volver a declarar ni usar para almacenar valores de otro tipo a menos que ese tipo sea convertible al tipo de la variable.Because C# is statically-typed at compile time, after a variable is declared, it cannot be declared again or used to store values of another type unless that type is convertible to the variable's type. Por ejemplo, no hay ninguna conversión de un entero a una cadena arbitraria.For example, there is no conversion from an integer to any arbitrary string. Por tanto, después de declarar i como un entero, no se le puede asignar la cadena "Hello", como se muestra en el código siguiente.Therefore, after you declare i as an integer, you cannot assign the string "Hello" to it, as is shown in the following code.

int i;  
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"  

Pero es posible que en ocasiones sea necesario copiar un valor en una variable o parámetro de método de otro tipo.However, you might sometimes need to copy a value into a variable or method parameter of another type. Por ejemplo, es posible que tenga una variable de entero que se necesita pasar a un método cuyo parámetro es de tipo double.For example, you might have an integer variable that you need to pass to a method whose parameter is typed as double. O es posible que tenga que asignar una variable de clase a una variable de tipo de interfaz.Or you might need to assign a class variable to a variable of an interface type. Estos tipos de operaciones se denominan conversiones de tipos.These kinds of operations are called type conversions. En C#, se pueden realizar las siguientes conversiones de tipos:In C#, you can perform the following kinds of conversions:

  • Conversiones implícitas: no se requiere ninguna sintaxis especial porque la conversión tiene seguridad de tipos y no se perderá ningún dato.Implicit conversions: No special syntax is required because the conversion is type safe and no data will be lost. Los ejemplos incluyen conversiones de tipos enteros más pequeños a más grandes, y conversiones de clases derivadas a clases base.Examples include conversions from smaller to larger integral types, and conversions from derived classes to base classes.

  • Conversiones explícitas: las conversiones explícitas requieren un operador de conversión.Explicit conversions (casts): Explicit conversions require a cast operator. La conversión es necesaria si es posible que se pierda información en la conversión, o cuando es posible que la conversión no sea correcta por otros motivos.Casting is required when information might be lost in the conversion, or when the conversion might not succeed for other reasons. Entre los ejemplos típicos están la conversión numérica a un tipo que tiene menos precisión o un intervalo más pequeño, y la conversión de una instancia de clase base a una clase derivada.Typical examples include numeric conversion to a type that has less precision or a smaller range, and conversion of a base-class instance to a derived class.

  • Conversiones definidas por el usuario: las conversiones definidas por el usuario se realizan por medio de métodos especiales que se pueden definir para habilitar las conversiones explícitas e implícitas entre tipos personalizados que no tienen una relación de clase base-clase derivada.User-defined conversions: User-defined conversions are performed by special methods that you can define to enable explicit and implicit conversions between custom types that do not have a base class–derived class relationship. Para obtener más información, vea Operadores de conversión.For more information, see Conversion Operators.

  • Conversiones con clases auxiliares: para realizar conversiones entre tipos no compatibles, como enteros y objetos System.DateTime, o cadenas hexadecimales y matrices de bytes, puede usar la clase System.BitConverter, la clase System.Convert y los métodos Parse de los tipos numéricos integrados, como Int32.Parse.Conversions with helper classes: To convert between non-compatible types, such as integers and System.DateTime objects, or hexadecimal strings and byte arrays, you can use the System.BitConverter class, the System.Convert class, and the Parse methods of the built-in numeric types, such as Int32.Parse. Para obtener más información, vea Cómo: Convertir una matriz de bytes en un valor int, Cómo: Convertir una cadena en un número y Cómo: Convertir cadenas hexadecimales en tipos numéricos.For more information, see How to: Convert a byte Array to an int, How to: Convert a String to a Number, and How to: Convert Between Hexadecimal Strings and Numeric Types.

Conversiones implícitasImplicit Conversions

Para los tipos numéricos integrados, se puede realizar una conversión implícita cuando el valor que se va a almacenar se puede encajar en la variable sin truncarse ni redondearse.For built-in numeric types, an implicit conversion can be made when the value to be stored can fit into the variable without being truncated or rounded off. Por ejemplo, una variable de tipo long (entero de 8 bytes) puede almacenar cualquier valor que un int (4 bytes en un equipo de 32 bits) pueda almacenar.For example, a variable of type long (8 byte integer) can store any value that an int (4 bytes on a 32-bit computer) can store. En el ejemplo siguiente, el compilador convierte implícitamente el valor de la derecha a un tipo long antes de asignarlo a bigNum.In the following example, the compiler implicitly converts the value on the right to a type long before assigning it to 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, vea Tabla de conversiones numéricas implícitas.For a complete list of all implicit numeric conversions, see Implicit Numeric Conversions Table.

Para 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.For reference types, an implicit conversion always exists from a class to any one of its direct or indirect base classes or interfaces. No se necesita ninguna sintaxis especial porque una clase derivada siempre contiene a todos los miembros de una clase base.No special syntax is necessary because a derived class always contains all the members of a base class.

Derived d = new Derived();  
Base b = d; // Always OK.  

Conversiones explícitasExplicit Conversions

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.However, if a conversion cannot be made without a risk of losing information, the compiler requires that you perform an explicit conversion, which is called a cast. Una conversión de tipos es una manera de informar explícitamente al compilador de que se pretende realizar la conversión y se es consciente de que se puede producir pérdida de datos.A cast is a way of explicitly informing the compiler that you intend to make the conversion and that you are aware that data loss might occur. Para realizar una conversión, especifique el tipo al que se va a convertir entre paréntesis delante del valor o la variable que se va a convertir.To perform a cast, specify the type that you are casting to in parentheses in front of the value or variable to be converted. El siguiente programa convierte un tipo double en un tipo int. El programa no se compilará sin la conversión.The following program casts a double to an int. The program will not compile without the cast.

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.For a list of the explicit numeric conversions that are allowed, see Explicit Numeric Conversions Table.

Para los tipos de referencia, se requiere una conversión explícita si es necesario convertir de un tipo base a un tipo derivado:For reference types, an explicit cast is required if you need to convert from a base type to a derived type:

// 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 will  
// 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 usa como referencia a ese objeto.A cast operation between reference types does not change the run-time type of the underlying object; it only changes the type of the value that is being used as a reference to that object. Para obtener más información, vea Poliformismo.For more information, see Polymorphism.

Excepciones de conversión de tipos en tiempo de ejecuciónType Conversion Exceptions at Run Time

En algunas conversiones de tipos de referencia, el compilador no puede determinar si una conversión será válida.In some reference type conversions, the compiler cannot determine whether a cast will be valid. Es posible que una operación de conversión que se compile correctamente produzca un error en tiempo de ejecución.It is possible for a cast operation that compiles correctly to fail at run time. Como se muestra en el ejemplo siguiente, una conversión de tipo que produce un error en tiempo de ejecución produce una excepción InvalidCastException.As shown in the following example, a type cast that fails at run time will cause an InvalidCastException to be thrown.


using System;

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.
        Console.WriteLine("Press any key to exit.");
        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 para permitir probar la compatibilidad antes de realizar una conversión.C# provides the is and as operators to enable you to test for compatibility before actually performing a cast. Para obtener más información, vea Cómo: Realizar conversiones seguras usando los operadores is y as.For more information, see How to: Safely Cast by Using as and is Operators.

Especificación del lenguaje C#C# Language Specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee Also

Guía de programación de C#C# Programming Guide
TiposTypes
Operator ()() Operator
explicitexplicit
implicitimplicit
Operadores de conversiónConversion Operators
Conversión de tipos generalizadaGeneralized Type Conversion
Conversión de tipos exportadosExported Type Conversion
Cómo: Convertir una cadena en un númeroHow to: Convert a String to a Number