Métodos genéricos (Guía de programación de C#)

Actualización: noviembre 2007

Un método genérico es un método que se declara con parámetros de tipo, como se muestra a continuación:

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

El siguiente ejemplo de código muestra una manera de llamar al método utilizando int para el argumento de tipo:

public static void TestSwap()
{
    int a = 1;
    int b = 2;

    Swap<int>(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}

También puede omitir el argumento de tipo y el compilador lo inferirá. La siguiente llamada a Swap es equivalente a la llamada anterior:

Swap(ref a, ref b);

Las mismas reglas para la inferencia de tipo se aplican a los métodos estáticos y a los métodos de instancia. El compilador es capaz de inferir los parámetros de tipo según los argumentos que se pasan al método; no es posible inferir los parámetros de tipo únicamente a partir de una restricción o un valor devuelto. Por consiguiente, la inferencia de tipo no funciona con métodos que no tienen parámetros. La inferencia de tipo tiene lugar en tiempo de compilación antes de que el compilador intente resolver las firmas de los métodos sobrecargados. El compilador aplica la lógica de inferencia de tipo a todos los métodos genéricos que comparten el mismo nombre. En el paso de resolución de sobrecarga, el compilador incluye sólo aquellos métodos genéricos en los cuales la inferencia se realizó correctamente.

Dentro de una clase genérica, los métodos no genéricos pueden tener acceso a los parámetros de tipo de nivel de clase, como sigue a continuación:

class SampleClass<T>
{
    void Swap(ref T lhs, ref T rhs) { }
}

Si define un método genérico que acepta los mismos parámetros de tipo que la clase contenedora, el compilador genera la advertencia CS0693, ya que, dentro del ámbito del método, el argumento suministrado para el T interno oculta el argumento suministrado para el T externo. Si necesita la flexibilidad de llamar a un método de clase genérico con argumentos de tipo distintos de los suministrados cuando se crearon instancias de la clase, considere la posibilidad de suministrar otro identificador para el parámetro de tipo del método, como se muestra en GenericList2<T> en el ejemplo siguiente.

class GenericList<T>
{
    // CS0693
    void SampleMethod<T>() { }
}

class GenericList2<T>
{
    //No warning
    void SampleMethod<U>() { }
}

Utilice las restricciones para habilitar las operaciones más especializadas en parámetros de tipo en métodos. Esta versión de Swap<T>, ahora denominada SwapIfGreater<T>, sólo se puede utilizar con argumentos de tipo que implementan IComparable<T>.

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
    T temp;
    if (lhs.CompareTo(rhs) > 0)
    {
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}

Los métodos genéricos se pueden sobrecargar en varios parámetros de tipo. Por ejemplo, los siguientes métodos se pueden encontrar todos en la misma clase:

void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }

Especificación del lenguaje C#

Para obtener más información, vea Especificación del lenguaje C#.

Vea también

Conceptos

Guía de programación de C#

Referencia

Introducción a los genéricos (Guía de programación de C#)

System.Collections.Generic

Métodos (Guía de programación de C#)