Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

[Dúvida] Erro nos exercícios

Olá boa noite! Estou com uma dificuldade em resolver um erro que estou ganhando no código do exercício 2 do curso 3 (C# Dominando a orientação a objetos) e aula 1 (Organizando o projeto): Na classe principal program.cs está ocorrendo o erro CS1503 (veja imagem abaixo). Pesquisei o que é esse erro, até entendi do que se trata mas não consegui resolver no meu código. Seguem os códigos. Muito obrigado pela ajuda e atenção.

using Alura.filmes;

Filme filme = new Filme("Um sonho de liberdade", 142, new List<string>() { "Tim Robbins", "Morgan Freeman" });
Filme filme2 = new Filme("O poderoso chefão", 175, new List<string>() { "Marlon Brando", "Al Pacino", "Talia Shire" });
Filme filme3 = new Filme("Batman - O Cavaleiro das Trevas", 152, new List<string>() { "Christian Bale", "Heath Ledger", "Maggie Gyleenhaal" });
Filme filme4 = new Filme("Senhor dos Anéis - O Retorno do Rei", 201, new List<string>() { "Elijah Wood", "Ian McKellen", "Viggo Mortensen" });
Filme filme5 = new Filme("Green Book - O Guia", 130, new List<String>() { "Viggo Mortensen", "Mahershala Ali" });

List<Filme> meusFilmesFavoritos = new List<Filme>();
meusFilmesFavoritos.Add(filme);
meusFilmesFavoritos.Add(filme2);
meusFilmesFavoritos.Add(filme3);
meusFilmesFavoritos.Add(filme4);
meusFilmesFavoritos.Add(filme5);

foreach (Filme f in meusFilmesFavoritos) {
    Console.WriteLine($"Filme: {f.Titulo}");
    Console.WriteLine($"Duracao: {f.Duracao}");
    f.ListarElenco();
    Console.WriteLine();
}
namespace Alura.filmes {

    class Filme {

        public List<Artista> Elenco { get; set; }
        public string Titulo { get; set; }
        public int Duracao { get; set; }
       


        public Filme(string titulo, int duracao, List<Artista> elenco) {
            if (elenco == null) {
                Elenco = new List<Artista>();
            }
            else {
                Elenco = elenco;
                foreach (var artista in Elenco) {
                    artista.AdicionarFilme(this);
                }
            }

            Titulo = titulo;
            Duracao = duracao;
        }

        public void AdicionarElenco(Artista artista) {
            Elenco.Add(artista);
            if (!artista.FilmesAtuados.Contains(this)) {
                artista.AdicionarFilme(this);
            }
            Console.WriteLine($"{artista} adicionado/a ao elenco.");
        }

        public void ListarElenco() {
            if (Elenco.Count == 0) {
                Console.WriteLine("Elenco vazio.");
            }
            else {
                Console.WriteLine("Elenco... ");
                foreach (var artista in Elenco) {
                    Console.WriteLine(artista.Nome);
                }
            }
        }
    }
}
using Alura.filmes;

class Artista {
    public string Nome { get; set; }
    public int Idade { get; set; }
    public List<Filme> FilmesAtuados { get; set; }
    public int QuantidadeDeFilmes => FilmesAtuados.Count;


    public Artista(string nome, int idade) {
        Nome = nome;
        Idade = idade;
        FilmesAtuados = new List<Filme>();
    }

    public void AdicionarFilme(Filme filme) {
        FilmesAtuados.Add(filme);
        if (!filme.Elenco.Contains(this)) filme.AdicionarElenco(this);
    }


    public void MostrarFilmesAtuados() {

        if (this.FilmesAtuados.Count == 0) {
            Console.WriteLine($"Nenhum filme encontrado na base para {this.Nome}");
            return;
        }

        Console.WriteLine($"Filmes de {this.Nome}...");
        foreach (var filme in FilmesAtuados) {
            Console.WriteLine($"Filme: {filme.Titulo}");
        }
    }
}
5 respostas

Oi, Jorge.

Quero muito te ajudar com sua dúvida, mas para isso, preciso de mais detalhes sobre o que está acontecendo. Assim consigo entender melhor o contexto e sugerir um caminho mais certeiro.

Para facilitar esse processo, recomendo dar uma olhadinha no nosso guia de como fazer uma boa pergunta no fórum. Ele traz algumas dicas rápidas que ajudam bastante na hora de explicar o problema, como compartilhar o código completo no GitHub e mandar aqui e o erro exato que está recebendo, se puder copiar e colar aqui vai ajudar também.

Quando puder, me manda mais informações? Fico no aguardo para seguir com você nessa.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Oi Lorena boa noite! Obrigado pelo retorno! Sim eu li o guia de como fazer uma boa pergunta. Sobre a questão do Git, no momento estou impossibilitado de fazer isso, pois o notebook em que eu estudo é o mesmo em que eu trabalho e o note é da empresa e preciso negociar com ela o download do Git. Quando criei esse tópico aqui no Fórum eu anexei a imagem do erro mas não sei porque parece que não está ficando visível aí prá você né? Eu também acabei esquecendo de anexar o código de uma classe: Artista. Fiz a edição deste tópico e coloquei o código da 3a. classe: Artista. As classes são : Program.cs, Filme.cs e Artista.cs. Queria ver com você se você teria como criar um projeto novo no Visual Studio (teste.sln, por exemplo) aí na sua máquina e colar esses 3 códigos das 3 classes e você já irá ver o erro que está ocorrendo no Program.cs. Muito obrigado Lorena e desculpe o incomodo!

solução!

Oi, Jorge.

Construí aqui na minha máquina o seu código.

O erro CS1503 que aparece no seu Program.cs é porque você está tentando passar uma List<string> para o construtor da classe Filme, mas o que ele espera é uma List<Artista>.

Olha só:

No Program.cs, você está criando um filme assim:

Filme filme = new Filme("Um sonho de liberdade", 142, new List<string>() { "Tim Robbins", "Morgan Freeman" });

Aqui você está passando uma lista de string (nomes dos artistas).Mas o seu construtor da classe Filme pede:

public Filme(string titulo, int duracao, List<Artista> elenco)

Ou seja, ele espera uma lista de Artista, não uma lista de string.

O que precisa ajustar:Você deve criar instâncias da classe Artista, e não só passar o nome como string.Por exemplo:

Artista timRobbins = new Artista("Tim Robbins", 65);
Artista morganFreeman = new Artista("Morgan Freeman", 86);

Filme filme = new Filme("Um sonho de liberdade", 142, new List<Artista> { timRobbins, morganFreeman });

E assim para todos os outros filmes também.Ou seja, antes de criar cada Filme, você cria os Artista que irão participar dele.

Códigos completos:

Program.cs

using Alura.filmes;

Artista timRobbins = new Artista("Tim Robbins", 65);
Artista morganFreeman = new Artista("Morgan Freeman", 86);
Artista marlonBrando = new Artista("Marlon Brando", 80);
Artista alPacino = new Artista("Al Pacino", 84);
Artista taliaShire = new Artista("Talia Shire", 78);
Artista christianBale = new Artista("Christian Bale", 50);
Artista heathLedger = new Artista("Heath Ledger", 28);
Artista maggieGyllenhaal = new Artista("Maggie Gyllenhaal", 46);
Artista elijahWood = new Artista("Elijah Wood", 43);
Artista ianMcKellen = new Artista("Ian McKellen", 85);
Artista viggoMortensen = new Artista("Viggo Mortensen", 65);
Artista mahershalaAli = new Artista("Mahershala Ali", 50);

Filme filme1 = new Filme("Um sonho de liberdade", 142, new List<Artista> { timRobbins, morganFreeman });
Filme filme2 = new Filme("O poderoso chefão", 175, new List<Artista> { marlonBrando, alPacino, taliaShire });
Filme filme3 = new Filme("Batman - O Cavaleiro das Trevas", 152, new List<Artista> { christianBale, heathLedger, maggieGyllenhaal });
Filme filme4 = new Filme("Senhor dos Anéis - O Retorno do Rei", 201, new List<Artista> { elijahWood, ianMcKellen, viggoMortensen });
Filme filme5 = new Filme("Green Book - O Guia", 130, new List<Artista> { viggoMortensen, mahershalaAli });

List<Filme> meusFilmesFavoritos = new List<Filme> { filme1, filme2, filme3, filme4, filme5 };

foreach (Filme f in meusFilmesFavoritos)
{
    Console.WriteLine($"Filme: {f.Titulo}");
    Console.WriteLine($"Duração: {f.Duracao} minutos");
    f.ListarElenco();
    Console.WriteLine();
}

Filme.cs

namespace Alura.filmes
{
    class Filme
    {
        public List<Artista> Elenco { get; set; }
        public string Titulo { get; set; }
        public int Duracao { get; set; }

        public Filme(string titulo, int duracao, List<Artista> elenco)
        {
            if (elenco == null)
            {
                Elenco = new List<Artista>();
            }
            else
            {
                Elenco = elenco;
                foreach (var artista in Elenco)
                {
                    artista.AdicionarFilme(this);
                }
            }

            Titulo = titulo;
            Duracao = duracao;
        }

        public void AdicionarElenco(Artista artista)
        {
            Elenco.Add(artista);
            if (!artista.FilmesAtuados.Contains(this))
            {
                artista.AdicionarFilme(this);
            }
            Console.WriteLine($"{artista.Nome} adicionado/a ao elenco.");
        }

        public void ListarElenco()
        {
            if (Elenco.Count == 0)
            {
                Console.WriteLine("Elenco vazio.");
            }
            else
            {
                Console.WriteLine("Elenco:");
                foreach (var artista in Elenco)
                {
                    Console.WriteLine(artista.Nome);
                }
            }
        }
    }
}

Continua no próximo post.

Artista.cs

using Alura.filmes;

class Artista
{
    public string Nome { get; set; }
    public int Idade { get; set; }
    public List<Filme> FilmesAtuados { get; set; }
    public int QuantidadeDeFilmes => FilmesAtuados.Count;

    public Artista(string nome, int idade)
    {
        Nome = nome;
        Idade = idade;
        FilmesAtuados = new List<Filme>();
    }

    public void AdicionarFilme(Filme filme)
    {
        FilmesAtuados.Add(filme);
        if (!filme.Elenco.Contains(this))
        {
            filme.AdicionarElenco(this);
        }
    }

    public void MostrarFilmesAtuados()
    {
        if (FilmesAtuados.Count == 0)
        {
            Console.WriteLine($"Nenhum filme encontrado na base para {Nome}");
            return;
        }

        Console.WriteLine($"Filmes de {Nome}:");
        foreach (var filme in FilmesAtuados)
        {
            Console.WriteLine($"Filme: {filme.Titulo}");
        }
    }
}

Agora sim o erro CS1503 desaparece e seu programa vai rodar mostrando os filmes e seus elencos no console!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

OI Lorena, boa noite! Puxa muito obrigado! Você é nota 10! muito bem explicado, entendi tudo! Sua didática é ótima!