1
resposta

Como usar um método genérico?

Olá!

Criei uma classe com um método genérico para poder somar int ou float. Mas está acontecendo um erro com o código "acumulador += item;". Como poderia consertar? Obrigado desde já!

Classe Program.

namespace Testando_cs
{
    class Program
    {
        static void Main(string[] args)
        {
            int soma = Somadora<int>.somarTodos(1, 2, 4, 7, 99, 10, 2);
            Console.WriteLine(soma);
        }
    }
}

Classe genérica:

namespace Testando_cs
{
    static class Somadora<t>
    {
        public static t somarTodos(params t[] itens)
        {
            t acumulador;
            foreach(t item in itens)
            {
                acumulador += item;
            }
            return acumulador;
        }
    }
}
1 resposta

Olá

Realizei alguns testes e não consegui fazer funcionar da forma como vc deseja, ou seja fazer com que o método somarTodos retorne o tipo passado (T). Do jeito que esta acredito que o erro ocorre pelo vs não saber somar os tipos T, teria que de alguma forma em tempo de execução ele tentar, dai se ele não conseguir gerar somar gerar uma consistência ou uma mensagem.

Consegui fazer funcionar dizendo qual é o tipo de retorno da soma e fazendo uma conversão para este tipo. não sei se serve para o que vc pretende mas segue o código:

    static class Somadora // se quiser deixar da forma antiga não tem problema
    {
        public static decimal somarTodos<T>(params T[] itens)  // basta alterar aqui para que não precise passar o tipo
        {
            decimal acumulador = 0;

            foreach (T item in itens)
            {
                acumulador += Convert.ToDecimal(item);
            }

            return acumulador;
        }
    }

    static class Program
    {
        static void Main()
        {
            decimal soma = Somadora.somarTodos(1.2f, 2.5f, 4.0f); // não é necessário passar o tipo do valor, pois fica implícito
            decimal soma1 = Somadora.somarTodos(1, 2, 3, 4);
            decimal soma2 = Somadora.somarTodos(1.2, 2.5, 4.0);
            decimal soma3 = Somadora.somarTodos(1.2f, 2.5f, 4.0f);
            decimal soma4 = Somadora.somarTodos(-1.2f, -2.5f, 4.0f);
        }    
    }

Se vc ou alguém encontrar uma forma de funcionar do jeito que vc quer manda ai, é um teste bem interessante