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

Un método genérico es un método que se declara con parámetros de tipo, de la manera siguiente:A generic method is a method that is declared with type parameters, as follows:

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

En el siguiente ejemplo de código se muestra una manera de llamar al método con int para el argumento de tipo:The following code example shows one way to call the method by using int for the type argument:

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 deducirá.You can also omit the type argument and the compiler will infer it. La siguiente llamada a Swap es equivalente a la llamada anterior:The following call to Swap is equivalent to the previous call:

Swap(ref a, ref b);

Las mismas reglas para la inferencia de tipos se aplican a los métodos estáticos y a los métodos de instancia.The same rules for type inference apply to static methods and instance methods. El compilador puede deducir los parámetros de tipo basados en los argumentos de método que se pasan; no puede deducir los parámetros de tipo solo desde un valor devuelto o una restricción.The compiler can infer the type parameters based on the method arguments you pass in; it cannot infer the type parameters only from a constraint or return value. Por lo tanto, la inferencia de tipos no funciona con métodos que no tienen parámetros.Therefore type inference does not work with methods that have no parameters. La inferencia de tipos se produce en tiempo de compilación antes de que el compilador intente resolver las firmas de método sobrecargadas.Type inference occurs at compile time before the compiler tries to resolve overloaded method signatures. El compilador aplica la lógica de inferencia de tipos a todos los métodos genéricos que comparten el mismo nombre.The compiler applies type inference logic to all generic methods that share the same name. En el paso de resolución de sobrecarga, el compilador incluye solo esos métodos genéricos en los que la inferencia de tipos se ha realizado correctamente.In the overload resolution step, the compiler includes only those generic methods on which type inference succeeded.

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, de la manera siguiente:Within a generic class, non-generic methods can access the class-level type parameters, as follows:

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

Si define un método genérico que toma los mismos parámetros de tipo que la clase contenedora, el compilador genera la advertencia CS0693 porque dentro del ámbito del método, el argumento que se ha proporcionado para el T interno oculta el argumento que se ha proporcionado para el T externo.If you define a generic method that takes the same type parameters as the containing class, the compiler generates warning CS0693 because within the method scope, the argument supplied for the inner T hides the argument supplied for the outer T. Si necesita la flexibilidad de llamar a un método de la clase genérica con argumentos de tipo diferentes de los que se han proporcionado cuando se ha creado una instancia de la clase, considere la posibilidad de proporcionar otro identificador para el parámetro de tipo del método, como se muestra en GenericList2<T> en el ejemplo siguiente.If you require the flexibility of calling a generic class method with type arguments other than the ones provided when the class was instantiated, consider providing another identifier for the type parameter of the method, as shown in GenericList2<T> in the following example.

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

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

Use restricciones para permitir operaciones más especializadas en parámetros de tipo de métodos.Use constraints to enable more specialized operations on type parameters in methods. Esta versión de Swap<T>, ahora denominada SwapIfGreater<T>, solo puede usarse con argumentos de tipo que implementan IComparable<T>.This version of Swap<T>, now named SwapIfGreater<T>, can only be used with type arguments that implement 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 pueden sobrecargarse en varios parámetros de tipo.Generic methods can be overloaded on several type parameters. Por ejemplo, todos los métodos siguientes pueden ubicarse en la misma clase:For example, the following methods can all be located in the same class:

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

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.

Vea tambiénSee Also

System.Collections.Generic
Guía de programación de C#C# Programming Guide
Introducción a los genéricosIntroduction to Generics
MétodosMethods