Generic Methods (C# Programming Guide)

Um método genérico é um método que é declarado com parâmetros de tipo, como segue:

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:

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

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

Você também pode omitir o argumento de tipo e o compilador deduzirá. A seguinte chamada para Swap é equivalente a chamada anterior:

Swap(ref a, ref b);

As mesmas regras de inferência aplicam métodos estáticos e de métodos de instância. O compilador pode inferir os parâmetros de tipo com base em argumentos de método que você passar ele não é possível inferir os parâmetros de tipo somente a partir de uma restrição ou valor de retorno. Inferência de tipos, portanto, não funciona com métodos que não tem parâmetros. Inferência de tipo ocorre em tempo de compilação antes do compilador tenta resolver as assinaturas de método sobrecarregado. O compilador se aplica a lógica de inferência de tipo para todos os métodos genéricos que compartilham o mesmo nome. Na etapa de resolução de sobrecarga, o compilador inclui apenas os métodos genéricos em que a inferência de tipo bem-sucedida.

Dentro de uma classe genérica, métodos não genéricos podem acessar os parâmetros de tipo de nível de classe, como segue:

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

Se você definir um método genérico que leva os mesmos parâmetros de tipo como a classe continente, o compilador gera o aviso de CS0693 porque dentro do escopo do método, o argumento fornecido para interno T oculta o argumento fornecido para o exterior T. Se você precisar a flexibilidade de chamar um método de classe genérica com argumentos de tipo diferente daqueles fornecidos quando a classe foi instanciada, considere fornecer outro identificador para o parâmetro de tipo do método, conforme mostrado na GenericList2<T> o exemplo a seguir.

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 nos métodos. Esta versão do Swap<T>, agora denominado SwapIfGreater<T>, que só pode ser usado com argumentos de tipo que implementam 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. Por exemplo, os seguintes métodos podem todos ser localizados na mesma classe:

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

Especificação da linguagem C#

Para obter mais informações, consulte o C# Language Specification.

Consulte também

Referência

Introduction to Generics (C# Programming Guide)

System.Collections.Generic

Methods (C# Programming Guide)

Conceitos

C# Programming Guide