Interfaces genéricas no .NET
Este tópico fornece uma visão geral de interfaces genéricas do NET's que fornecem funcionalidades comuns entre famílias de tipos genéricos.
As interfaces genéricas fornecem contrapartes fortemente tipadas para interfaces não genéricas com a finalidade de realizar comparações de ordenação e de igualdade e para a funcionalidade que é compartilhada por tipos de coleção genéricos. O .NET 7 introduz interfaces genéricas para tipos semelhantes a números, por exemplo, System.Numerics.INumber<TSelf>. Essas interfaces permitem definir métodos genéricos que fornecem funcionalidade matemática, em que o parâmetro de tipo genérico é restrito a ser um tipo que implementa uma interface numérica genérica.
Observação
Os parâmetros de tipo de várias interfaces genéricas são marcados como covariantes ou contravariantes, o que fornece mais flexibilidade na atribuição e no uso dos tipos que implementam essas interfaces. Para obter mais informações, consulte Covariância e contravariância.
Comparações de ordem e igualdade
No namespace System, as interfaces genéricas System.IComparable<T> e System.IEquatable<T>, assim como suas contrapartes não genéricas, definem métodos para comparações de classificação e de igualdade, respectivamente. Os tipos implementam essas interfaces para permitir a execução dessas comparações.
No namespace System.Collections.Generic, as interfaces genéricas IComparer<T> e IEqualityComparer<T> oferecem uma maneira de definir uma comparação de ordenação ou igualdade para tipos que não implementam a interface System.IComparable<T> ou System.IEquatable<T>. Elas também fornecem uma maneira de redefinir essas relações para tipos que o fazem.
Essas interfaces são usadas pelos métodos e construtores de muitas classes de coleção genérica. Por exemplo, você pode passar um objeto IComparer<T> genérico para o construtor da classe SortedDictionary<TKey,TValue>, a fim de especificar uma ordem de classificação para um tipo que não implementa um System.IComparable<T> genérico. Há sobrecargas do método estático genérico Array.Sort e do método de instância List<T>.Sort para classificar matrizes e listas usando implementações IComparer<T> genéricas.
As classes genéricas Comparer<T> e EqualityComparer<T> fornecem classes base para implementações das interfaces genéricas IComparer<T> e IEqualityComparer<T> e também fornecem comparações padrão de ordenação e de igualdade por meio de suas respectivas propriedades Comparer<T>.Default e EqualityComparer<T>.Default.
Funcionalidade de coleção
A interface genérica ICollection<T> é a interface básica para tipos de coleção genérica. Ela fornece a funcionalidade básica para adicionar, remover, copiar e enumerar elementos. ICollection<T> herda da IEnumerable<T> genérica e da IEnumerable não genérica.
A interface genérica IList<T> estende a interface genérica ICollection<T> com métodos para recuperação indexada.
A interface genérica IDictionary<TKey,TValue> estende a interface genérica ICollection<T> com métodos para recuperação codificada. Os tipos genéricos de dicionário na biblioteca de classes base do .NET também implementam a interface não genérica IDictionary.
A interface genérica IEnumerable<T> fornece uma estrutura de enumerador genérico. A interface genérica IEnumerator<T> implementada pelos enumeradores genéricos herda a interface não genérica IEnumerator; os membros MoveNext e Reset, que não dependem do parâmetro de tipo
T
, só aparecem na interface não genérica. Isso significa que qualquer consumidor da interface não genérica também poderá consumir a interface genérica.
Funcionalidade matemática
O .NET 7 apresenta interfaces genéricas no namespace System.Numerics que descrevem tipos semelhantes a números e a funcionalidade disponível para eles. Os 20 tipos numéricos que a biblioteca de classes base .NET fornece, por exemplo, Int32 e Double, foram atualizados para implementar essas interfaces. A mais proeminente dessas interfaces é a INumber<TSelf>, que corresponde aproximadamente a um número "real".
Para obter mais informações sobre essas interfaces, confira Matemática genérica.