Compartir a través de


Cómo: Realizar conversiones seguras usando los operadores is y as (Guía de programación de C#)

Dado que los objetos son polimórficos, es posible que una variable de un tipo de clase base contenga un tipo derivado. Para tener acceso al método del tipo derivado, es necesario volver a convertir el valor al tipo derivado. Sin embargo, el intento de realizar una conversión de tipos sencilla en estos casos conlleva el riesgo de producir una excepción InvalidCastException. Por esa razón, C# proporciona los operadores is y as. Puede utilizar estos operadores para comprobar si una conversión de tipo se realizará correctamente sin hacer que se produzca una excepción. En general, el operador as suele ser más eficaz, ya que devuelve el valor de la conversión de tipo si esta puede realizarse correctamente. El operador is devuelve solamente un valor Boolean. Así, puede utilizarse cuando simplemente desee determinar el tipo de un objeto pero no tenga que realizar una conversión de tipo del mismo.

Ejemplo

En los ejemplos siguientes se muestra cómo utilizar los operadores is y as para realizar una conversión de un tipo de referencia a otro sin el riesgo de que se produzca una excepción. En el ejemplo también se muestra cómo utilizar el operador as con tipos de valor que aceptan valores NULL.

class SafeCasting
{
    class Animal
    {
        public void Eat() { Console.WriteLine("Eating."); }
        public override string ToString()
        {
            return "I am an animal.";
        }
    }
    class Mammal : Animal { }
    class Giraffe : Mammal { }

    class SuperNova { }

    static void Main()
    {
        SafeCasting app = new SafeCasting();

        // Use the is operator to verify the type. 
        // before performing a cast.
        Giraffe g = new Giraffe();
        app.UseIsOperator(g);

        // Use the as operator and test for null 
        // before referencing the variable.
        app.UseAsOperator(g);

        // Use the as operator to test 
        // an incompatible type.
        SuperNova sn = new SuperNova();
        app.UseAsOperator(sn);

        // Use the as operator with a value type. 
        // Note the implicit conversion to int? in  
        // the method body. 
        int i = 5;
        app.UseAsWithNullable(i);


        double d = 9.78654;
        app.UseAsWithNullable(d);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }

    void UseIsOperator(Animal a)
    {
        if (a is Mammal)
        {
            Mammal m = (Mammal)a;
            m.Eat();
        }
    }

    void UseAsOperator(object o)
    {
        Mammal m = o as Mammal;
        if (m != null)
        {
            Console.WriteLine(m.ToString());
        }
        else
        {
            Console.WriteLine("{0} is not a Mammal", o.GetType().Name);
        }
    }

    void UseAsWithNullable(System.ValueType val)
    {
        int? j = val as int?;
        if (j != null)
        {
            Console.WriteLine(j);
        }
        else
        {
            Console.WriteLine("Could not convert " + val.ToString());
        }
    }
}

Vea también

Referencia

Tipos (Guía de programación de C#)

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

Tipos que aceptan valores NULL (Guía de programación de C#)