Fácil C#
Delegate personalizado para operações matemáticas
Enunciado
Crie um delegate chamado Calculadora que recebe dois inteiros e retorna um inteiro. No método Main, atribua a esse delegate uma expressão lambda que soma dois números e outra que multiplica. Exiba o resultado de cada operação.
Requisitos
- Declare um delegate
Calculadoracom dois parâmetrosinte retornoint. - Use uma variável do tipo
Calculadorapara armazenar a lambda de soma. - Use a mesma variável para armazenar a lambda de multiplicação e exiba ambos os resultados.
Código inicial
using System;
// TODO: declare o delegate Calculadora
public class Programa
{
public static void Main()
{
// TODO: crie as lambdas e exiba os resultados
}
}
Saída esperada
Soma: 7
Multiplicação: 12
Ver dica
Lembre-se de que um delegate pode ser reatribuído como qualquer variável. Use Calculadora calc = (a, b) => a + b; e depois calc = (a, b) => a * b;.
Mostrar solução
using System;
// Declaração do delegate personalizado
public delegate int Calculadora(int a, int b);
public class Programa
{
public static void Main()
{
// Atribui uma lambda de soma ao delegate
Calculadora calc = (a, b) => a + b;
Console.WriteLine($"Soma: {calc(3, 4)}");
// Reatribui o delegate para a multiplicação
calc = (a, b) => a * b;
Console.WriteLine($"Multiplicação: {calc(3, 4)}");
}
}
Passo a passo
- Declaramos o delegate
Calculadoracom a assinaturaint Calculadora(int a, int b). Isso define o contrato que qualquer método referenciado deve seguir. - No
Main, criamos a variávelcalcdo tipoCalculadorae atribuímos uma expressão lambda(a, b) => a + b. O compilador converte a lambda para o delegate. - Chamamos
calc(3, 4)e imprimimos o resultado. O delegate invoca o método encapsulado. - Reatribuímos
calcpara a lambda de multiplicação. O delegate agora aponta para outro método. - Chamamos novamente e imprimimos o novo resultado.
Por que funciona
O delegate é um tipo que encapsula um método com uma assinatura específica. Ao atribuir uma lambda, criamos uma instância do delegate que aponta para o código da lambda. Como delegates são objetos, podemos reatribuí-los a qualquer momento, desde que a assinatura seja compatível. Isso permite tratar métodos como valores, um dos pilares da programação funcional em C#.
Erros comuns
- Esquecer de declarar o delegate: se tentar usar
Calculadorasem a declaração, o compilador acusa erroCS0246(tipo não encontrado). - Assinatura incompatível: tentar atribuir um método que não corresponde a
(int, int) => intgera erroCS0123(nenhuma sobrecarga corresponde ao delegate). - Usar
varsem tipo explícito:var calc = (a, b) => a + b;não compila porque o compilador não consegue inferir o tipo do delegate. É preciso declararCalculadora calc = ...ou usarFunc<int, int, int>.
Outra forma de resolver
Usar Func<int, int, int> em vez de declarar um delegate personalizado:
Func<int, int, int> calc = (a, b) => a + b;
Console.WriteLine($"Soma: {calc(3, 4)}");
calc = (a, b) => a * b;
Console.WriteLine($"Multiplicação: {calc(3, 4)}");
Prefira Func quando a assinatura for simples e não precisar de um nome semântico.
Saída esperada
Soma: 7
Multiplicação: 12