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

Dúvida no curso C# II ex. Modificadores de Acesso Inconsistente

A resolução do exercício diz o seguinte:

Resposta correta: 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:

Não entendi nada, porque o código não compila?

5 respostas

Olá.

O método adiciona é public e recebe uma classe Conta que não é public, ela tem o modificador internal (padrão, quando não setamos public, protected 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. Como você pode cair em casos de algo fora do assembly tentar acessar esse método passando uma Conta (o que daria erro), o compilador te avisa disso e não compila o código, evitando que sua aplicação quebre em algum momento e você não sabe o motivo.

Se você deixar a classe Conta como public, por exemplo, o problema é resolvido.

Oi Henrique, tudo bom?

Vamos analisar o código desse exercicio, temos nossa classe conta:

class Conta //modificador de acesso padrão (internal){
    public double Saldo { get; private set; } //modificador de acesso publico
   // outros métodos e atributos da conta
}

E, além disso, ele nos pede para avaliar o totalizador de contas:

public class TotalizadorDeContas //modificador de acesso publico
{
    public double Saldo { get; private set; } //modificador de acesso publico

    public void Adiciona(Conta c) //modificador de acesso publico recebendo um parametro do tipo Conta que tem visibilidade internal!
    {
        this.Saldo += c.Saldo;
    }
}

Ou seja, o nosso método adiciona pode ser acessado por qualquer um mas recebe um atributo que só pode ser acessado de dentro do mesmo projeto!

Nesse caso, se utilizarmos esse método de fora do projeto não conseguiremos fazer nada com nossa Conta c. Pensando nisso, a galera do c# já obrigou os desenvolvedores a evitarem essa situação. Por isso o código não compila, temos uma inconsistência na forma com que estamos lidando com nossos modificadores de acesso =)

Qualquer dificuldade, compartilhe com a gente! Bons estudos.

"Pensando nisso, a galera do c# já obrigou os desenvolvedores a evitarem essa situação. "

Ainda bem! Se não fosse esse erro de compilação, uma aplicação com um erro grosseiro assim poderia "ir ao ar" e acabar gerando exceções terríveis ao usuário.

Mas porque esse erro ocorre mesmo eles estando dentro do mesmo namespace?

solução!

Justamente pra você não acabar esquecendo e chamando a classe de outro namespace. A Microsoft aposta que você vai esquecer, então eles já nem deixam o compilador compilar o código, pra evitar isso.