1
resposta

[Dúvida] Exercicio Carro

Meu programa esta dando erro "System.StackOverflowException: 'Exception_WasThrown'", gostaria de saber oq tem de errado no código

class Carro { public string Modelo { get; set; } public string Cor { get; set; } public int Velocidade { get; set; } public string Fabricante { get; set; } public string Descricao_detalhada => $"O carro {Modelo}, ano {Ano} é fabricado pela {Fabricante}.";

public int Ano 
{
    get => Ano;

    set
    {
        if (value < 1960 || value > 2023)
        {
            Ano = value;
        }

        else
        {
            Console.WriteLine("Ano inserido inválido");
        }
    } 

}

public void Buzina()
{
    Console.WriteLine("BIIIIIIIIIIP!!");
}
public void Frear(int drecemento)
{
    Console.WriteLine("Digite a velocidade do carro:  ");

    Velocidade = Convert.ToInt32(Console.ReadLine());

    if (Velocidade < 0)

    {
        Velocidade -= drecemento;

    }
    Console.WriteLine("É melhor frearmos mesmo");



}
public void Acelerar(int incremento)
{
    Console.WriteLine("Digite a velocidade do carro:  ");

    Velocidade = Convert.ToInt32(Console.ReadLine());

    if (incremento > 0)

    {
        Velocidade += incremento;
    }
        Console.WriteLine("É melhor frearmos mesmo");
    


}

}

Carro carro = new Carro(); carro.Modelo = "C3"; carro.Ano = 2000; carro.Cor = "Azul"; carro.Fabricante = "Citroën"; Console.WriteLine(carro.Descricao_detalhada); carro.Buzina(); carro.Acelerar(20); carro.Frear(10);

1 resposta

Leonardo, bom dia! Como vai?

Parece que você está enfrentando um problema com o erro System.StackOverflowException. Esse tipo de erro geralmente ocorre quando há uma chamada recursiva infinita. No seu código, isso está acontecendo na propriedade Ano.

Na propriedade Ano, você está usando Ano tanto no getter quanto no setter, o que causa uma chamada recursiva infinita. Para corrigir isso, você deve usar um campo privado para armazenar o valor do ano. Vou mostrar como você pode ajustar isso:

class Carro
{
    public string Modelo { get; set; }
    public string Cor { get; set; }
    public int Velocidade { get; set; }
    public string Fabricante { get; set; }
    public string Descricao_detalhada => $"O carro {Modelo}, ano {Ano} é fabricado pela {Fabricante}.";

    private int _ano; // Campo privado para armazenar o ano

    public int Ano
    {
        get => _ano;
        set
        {
            if (value >= 1960 && value <= 2023)
            {
                _ano = value;
            }
            else
            {
                Console.WriteLine("Ano inserido inválido");
            }
        }
    }

    public void Buzina()
    {
        Console.WriteLine("BIIIIIIIIIIP!!");
    }

    public void Frear(int decremento)
    {
        Console.WriteLine("Digite a velocidade do carro:  ");
        Velocidade = Convert.ToInt32(Console.ReadLine());

        if (Velocidade > 0) // Corrigi a lógica aqui
        {
            Velocidade -= decremento;
        }
        Console.WriteLine("É melhor frearmos mesmo");
    }

    public void Acelerar(int incremento)
    {
        Console.WriteLine("Digite a velocidade do carro:  ");
        Velocidade = Convert.ToInt32(Console.ReadLine());

        if (incremento > 0)
        {
            Velocidade += incremento;
        }
        Console.WriteLine("É melhor frearmos mesmo");
    }
}

Com essas alterações, a propriedade Ano agora utiliza um campo privado _ano para armazenar seu valor, evitando a recursão infinita. Além disso, fiz uma pequena correção na lógica do método Frear para verificar se a velocidade é maior que zero antes de decrementá-la.

Espero ter ajudado e bons estudos!