Médio C#

Método com `out` e sobrecarga

Enunciado

Crie um método Calcular sobrecarregado: uma versão recebe dois int e retorna a soma; outra recebe dois double e retorna a média. Além disso, crie um método TentarConverter que recebe uma string e usa out int para retornar se a conversão foi bem-sucedida e o valor convertido. No Main, teste as sobrecargas e o out.

Requisitos

  • Método Calcular(int a, int b) retorna a soma dos dois inteiros.
  • Método Calcular(double a, double b) retorna a média dos dois doubles.
  • Método TentarConverter(string texto, out int numero) retorna true se a conversão for bem-sucedida; caso contrário, false e numero = 0.
  • No Main, chame as duas sobrecargas e o método TentarConverter com um valor válido e um inválido, imprimindo os resultados.

Código inicial

using System;

class Program
{
    // TODO: implementar Calcular(int, int)
    // TODO: implementar Calcular(double, double)
    // TODO: implementar TentarConverter(string, out int)

    static void Main()
    {
        // TODO: testar as sobrecargas e o out
    }
}

Saída esperada

Soma: 7
Média: 4
Conversão de '123': 123
Conversão de 'abc': falhou
Ver dica

Para TentarConverter, use int.TryParse internamente ou faça a lógica manual com int.TryParse. Lembre-se de atribuir numero antes de retornar.

Mostrar solução
using System;

class Program
{
    // Sobrecarga 1: soma de inteiros
    static int Calcular(int a, int b) => a + b;

    // Sobrecarga 2: média de doubles
    static double Calcular(double a, double b) => (a + b) / 2.0;

    // Método com parâmetro out: tenta converter string para int
    static bool TentarConverter(string texto, out int numero)
    {
        // Tenta converter; se falhar, atribui 0 e retorna false
        return int.TryParse(texto, out numero);
    }

    static void Main()
    {
        // Chama a sobrecarga de int
        Console.WriteLine($"Soma: {Calcular(3, 4)}"); // 7

        // Chama a sobrecarga de double
        Console.WriteLine($"Média: {Calcular(3.0, 5.0)}"); // 4

        // Testa conversão bem-sucedida
        if (TentarConverter("123", out int valor))
            Console.WriteLine($"Conversão de '123': {valor}");

        // Testa conversão que falha
        if (!TentarConverter("abc", out int _))
            Console.WriteLine("Conversão de 'abc': falhou");
    }
}

Passo a passo

  1. Definimos duas sobrecargas de Calcular: uma para int e outra para double.
  2. A versão int retorna a soma; a versão double retorna a média.
  3. O método TentarConverter usa int.TryParse, que já fornece o padrão out e retorna bool.
  4. No Main, chamamos Calcular(3, 4) e Calcular(3.0, 5.0); o compilador escolhe a sobrecarga correta pelos tipos dos argumentos.
  5. Para o out, chamamos TentarConverter("123", out int valor) e usamos o valor convertido.
  6. Na segunda chamada, usamos out int _ para descartar o valor, já que só queremos testar o retorno.

Por que funciona

A sobrecarga permite o mesmo nome para operações semelhantes, mas com tipos diferentes. O método com out é útil quando precisamos retornar mais de uma informação: o sucesso da operação e o valor convertido. int.TryParse já implementa esse padrão, então podemos delegar a ele.

Erros comuns

  • Não atribuir o parâmetro out: se TentarConverter não atribuir numero em todos os caminhos, o compilador gera erro CS0177. Use int.TryParse que sempre atribui.
  • Chamar a sobrecarga errada: Calcular(3, 4.0) não compila porque não há sobrecarga (int, double). Converta explicitamente ou crie a sobrecarga.
  • Esquecer out na chamada: TentarConverter("123", valor) não compila; é obrigatório out antes da variável.

Outra forma de resolver

Poderia usar int.Parse dentro de um try/catch, mas TryParse é mais eficiente e idiomático para tentativas de conversão.

Saída esperada

Soma: 7
Média: 4
Conversão de '123': 123
Conversão de 'abc': falhou