Métodos genéricos (Guia de programação C#)
Um método genérico é um método que é declarado com parâmetros de tipo sistema autônomo 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 telefonar seguinte para Swap é equivalente a telefonar anterior:
Swap(ref a, ref b);
As mesmas regras para inferência de tipos se aplicam a métodos estático e métodos de instância.O compilador pode inferir tipos dos parâmetros com base nos argumentos do método que você passar em; ele não é possível deduzir os parâmetros de tipo somente de uma restrição ou valor retornado.inferência de tipos de tipos, portanto, não funciona com os métodos que possuem sem parâmetros.inferência de tipos de tipos ocorre em time de compilar antes do compilador tenta resolver as assinaturas de método sobrecarregado.O compilador se aplica a lógica de inferência de tipos de tipos a 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 inferência de tipos bem-sucedida.
Dentro de uma classe genérica, métodos não genéricos podem acessar sistema autônomo 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 sistema autônomo mesmos parâmetros de tipo da classe do recipiente, o compilador gera aviso CS0693 porque dentro do escopo do método, o argumento fornecido para o interna T oculta o argumento fornecido para o externo T. Se for necessária 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 Outros identificador para o parâmetro de tipo do método, conforme mostrado no 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 em 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 da linguagem C#.