Métodos genéricos (Guia de Programação em C#)Generic Methods (C# Programming Guide)

Um método genérico é um método declarado com parâmetros de tipo, da seguinte maneira: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;
}

O exemplo de código a seguir mostra uma maneira de chamar o método usando int para o 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);
}

Também é possível omitir o argumento de tipo e o compilador o inferirá.You can also omit the type argument and the compiler will infer it. Esta chamada para Swap é equivalente à chamada anterior:The following call to Swap is equivalent to the previous call:

Swap(ref a, ref b);

As mesmas regras de inferência de tipos se aplicam a métodos estáticos e métodos de instância.The same rules for type inference apply to static methods and instance methods. O compilador pode inferir os parâmetros de tipo com base nos argumentos de método passados; não é possível inferir os parâmetros de tipo somente de uma restrição ou valor retornado.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. Portanto, a inferência de tipos não funciona com métodos que não têm parâmetros.Therefore type inference does not work with methods that have no parameters. A inferência de tipos ocorre em tempo de compilação, antes de o compilador tentar resolver assinaturas de método sobrecarregadas.Type inference occurs at compile time before the compiler tries to resolve overloaded method signatures. O compilador aplica a lógica da inferência de tipos a todos os métodos genéricos que compartilham o mesmo nome.The compiler applies type inference logic to all generic methods that share the same name. Na etapa de resolução de sobrecarga, o compilador incluirá somente os métodos genéricos em que a inferência de tipos foi bem-sucedida.In the overload resolution step, the compiler includes only those generic methods on which type inference succeeded.

Em uma classe genérica, métodos não genéricos podem acessar os parâmetros de tipo de nível de classe, da seguinte maneira: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) { }
}

Se um método genérico que usa os mesmos parâmetros de tipo da classe que o contém for definido, o compilador gerará um aviso CS0693, pois, dentro do escopo do método, o argumento fornecido para o T interno oculta o argumento fornecido para o 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. Caso seja necessária a flexibilidade de chamar um método de classe genérica com argumentos de tipo diferentes dos fornecidos quando a instância da classe foi criada, considere fornecer outro identificador ao parâmetro de tipo do método, conforme mostrado no GenericList2<T> do exemplo a seguir.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 restrições para permitir operações mais especializadas em parâmetros de tipo de métodos.Use constraints to enable more specialized operations on type parameters in methods. Essa versão do Swap<T>, agora denominada SwapIfGreater<T>, pode ser usada somente com argumentos de tipo que implementam 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;
    }
}

Métodos genéricos podem ser sobrecarregados vários parâmetros de tipo.Generic methods can be overloaded on several type parameters. Por exemplo, todos os seguintes métodos podem ser localizados na mesma classe:For example, the following methods can all be located in the same class:

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

Especificação da Linguagem C#C# Language Specification

Para obter mais informações, consulte a Especificação da linguagem C#.For more information, see the C# Language Specification.

Consulte tambémSee Also

System.Collections.Generic
Guia de Programação em C#C# Programming Guide
Introdução aos genéricosIntroduction to Generics
MétodosMethods