Médio C#
Método genérico com restrição IComparable
Enunciado
Implemente um método genérico Maior<T> que recebe dois argumentos do tipo T e retorna o maior. Use a restrição where T : IComparable<T> para garantir que os tipos possam ser comparados. Teste com int e string.
Requisitos
- O método deve ser genérico:
public static T Maior<T>(T a, T b). - Deve ter a restrição
where T : IComparable<T>. - Retorna o maior valor usando
CompareTo. - O programa principal deve testar com
intestringe imprimir os resultados.
Código inicial
using System;
public static class Utilitarios
{
// implemente o método Maior
}
class Program
{
static void Main()
{
Console.WriteLine(Utilitarios.Maior(10, 20)); // 20
Console.WriteLine(Utilitarios.Maior("Ana", "Bia")); // Bia
}
}
Saída esperada
20
Bia
Ver dica
Use a.CompareTo(b) > 0 para decidir qual é o maior.
Mostrar solução
using System;
public static class Utilitarios
{
public static T Maior<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) > 0 ? a : b;
}
}
class Program
{
static void Main()
{
Console.WriteLine(Utilitarios.Maior(10, 20)); // 20
Console.WriteLine(Utilitarios.Maior("Ana", "Bia")); // Bia
}
}
Passo a passo
- Declaramos a classe estática
Utilitariospara conter o método. - O método
Maior<T>recebe dois parâmetros do tipo T. - A restrição
where T : IComparable<T>garante que T implementa a interfaceIComparable<T>, permitindo chamarCompareTo. - Comparamos
acombusandoa.CompareTo(b) > 0; se verdadeiro, retornamosa, senãob. - No
Main, chamamos o método comintestring, que implementamIComparable<T>.
Por que funciona
A restrição permite que o compilador saiba que T tem o método CompareTo, então o código genérico pode usá-lo. Isso evita casts e mantém a segurança de tipos. Qualquer tipo que implemente IComparable<T> pode ser usado.
Erros comuns
- Esquecer a restrição: o compilador não permitirá chamar
CompareToem T, gerando erro CS1061. - Usar
IComparablenão genérico: funciona, mas perde a segurança de tipos e pode causar boxing. - Tentar comparar tipos que não implementam
IComparable<T>, como uma classe personalizada sem a interface; isso causará erro de compilação.
Outra forma de resolver
Usar Comparer<T>.Default.Compare(a, b) > 0 permite comparar sem restrição, pois Comparer<T>.Default lida com tipos que implementam IComparable<T> ou IComparable. É útil quando não se quer restringir o tipo.
Saída esperada
20
Bia