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

Modificador de Acesso Inconsistente

A resposta do exercício diz simplismente como solução o seguinte:

O código não compila. Como tanto a classe TotalizadorDeContas quanto seu método Adiciona são públicos, eles podem ser acessados de qualquer ponto da aplicação, porém como o método Adiciona recebe uma classe não pública, existem situações em que o método Adiciona pode ser acessado, porém seu argumento, não. Para evitar esses casos, o C# gera um erro de compilação.

Essa explanação para o erro de acessibilidade penso ser muito fraco e não ataca todas as tratativas e possibilidades possíveis.

Por que? Suponhamos que a classe Conta tenha de ficar - obrigatoriamente - como Internal, ou seja, foi definido assim no projeto (como estar hoje no exercício). Então como solucionar o erro?

Entendendo o problema: Sabemos que o método Adiciona() é do tipo public e recebe uma classe Conta que não é public, ela tem o modificador internal (padrão, quando não setamos public, protected, protected internal ou private):

class Conta { }   =   internal class Conta { }

O modificador padrão internal permite que qualquer classe do mesmo assembly (DLL) acesse tal classe ou atributo, porém não permite que nada fora do assembly acesse.

Adendo importante: Os modificadores de acesso no C# por hieraquia de menor acessibilidade são:

  1. private;
  2. protected internal;
  3. internal (padrão - ou seja - quando não declaramos);
  4. protected;
  5. public.

Então, suponhamos que a classe Conta tenha de ficar - obrigatoriamente - como Internal, ou seja, como estar hoje no exercício.

Para solucionar este problema o modificador de acesso do seu método Adicionar(Conta c), tem de ter o mesmo níveis de acesso/visibilidade para que respeite o que foi definido na classe Conta.

Alguns exemplo que solucionariam o caso:

internal void Adiciona(Conta c) { }

ou

private void Adiciona(Conta c) { }

Não é apenas colocar a classe Conta como public (que é uma das possíveis soluções).

Sugiro uma análise e correção para esta questão, pois quem não tem conhecimento neste quesito pode-se persistir a dúvida. Foi o que me ocorreu e fui pesquisar sobre este quesito.

2 respostas
solução!

Oi Alexandre, obrigado pelo feedback tão detalhado. Acho que o mais legal seria vc mesmo sugerir essa correção, para que fique registrado que foi vc que melhorou nossa plataforma. O link para essa atividade, em específico é esse aqui => https://cursos.alura.com.br/suggestions/new/csharp/1651/question

No icone da engrenagem, tem uma opção sugerir melhoria, que é exatamente o que vc fez :).

Oi, Alexandre!

Sua análise está perfeita. Como você disse, num cenário onde se tenha de usar internal, só será possível a utlização do recurso se tiver o mesmo nível de acessibilidade.

O objetivo do código do curso é justamente deixar o código aberto para ser utilizado dentro e fora do Assembly, por isso mantivemos o exemplo do public, que um entre muitos exemplos. Para não confundir um aluno que está começando e ainda não está tão acostumado com código, resolvemos deixar da forma mais comum que normalmente encontramos nos códigos que fazemos, que é usando public. Há mais alunos que possuem dificuldade em aprender de início do que o contrário.

Tanto que só falamos mais para frente de protected e não chegamos a comentar de protected internal. Esse é só o segundo módulo do curso de C#, ainda tem bastante coisa para ver .

Mas estamos em constante melhoria dos nossos cursos, textos e conteúdo. Certamente seu ponto de vista e sua preocupação serão considerados :)

Boas festas!