Métodos genéricos (guia de programação do C#)
Um método genérico é um método que é declarado com parâmetros de tipo, da seguinte forma:
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 inferirá.A seguinte chamada para Swap é equivalente a chamada anterior:
Swap(ref a, ref b);
As mesmas regras de inferência de tipo aplicam-se métodos de instância e métodos estáticos.O compilador pode inferir os parâmetros de tipo com base em argumentos de método que você passar em; 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 sem 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, da seguinte maneira:
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 CS0693 do aviso porque dentro do escopo do método, o argumento fornecidos 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> no 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>, 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 Especificação de linguagem do C#.
Consulte também
Referência
Introdução aos genéricos (guia de programação do C#)
Métodos (guia de programação do C#)