Acessibilidade inconsistente: o tipo de parâmetro é menos acessível que o método

227

Estou tentando passar um objeto (uma referência ao usuário atualmente conectado, basicamente) entre dois formulários. No momento, tenho algo nesse sentido no formulário de login:

private ACTInterface oActInterface;

public void button1_Click(object sender, EventArgs e)
    {
        oActInterface = new ACTInterface(@"\\actserver\Database\Premier.pad",this.textUser.Text,this.textPass.Text);

        if (oActInterface.checkLoggedIn())
        {
            //user has authed against ACT, so we can carry on
            clients oClientForm = new clients(oActInterface);
            this.Hide();
            oClientForm.Show();
        }
        else...

no próximo formulário (clientes), tenho:

public partial class clients : Form
{
    private ACTInterface oActInt {get; set;}

    public clients(ACTInterface _oActInt)

... o que resulta em eu obter:

Error   1   Inconsistent accessibility: 
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)'  
c:\work\net\backup\support\support\clients.cs   20  16  support

Realmente não entendo qual é o problema - ambos os campos são privados e acessados ​​pelo método público relevante no formulário. Googling realmente não ajuda, pois apenas aponta para um elemento ser público e o outro privado, o que não é o caso aqui.

Alguém ajuda?

dodgrile
fonte

Respostas:

353

O construtor da publicclasse clientsé, publicmas tem um parâmetro do tipo ACTInterfaceque é private(está aninhado em uma classe?). Você não pode fazer isso. Você precisa tornar ACTInterfacepelo menos tão acessível quanto clients.

Jason
fonte
2
Para mais informações confira artigo do MSDN em caso de erro CS0051
Alexei Levenkov
5
Isso me ajudou. Eu estava tentando fazer o seguinte: JsonConvert.DeserializeObject <List <Name_Of_My_Model>> (response.Content.ReadAsStringAsync (). Result); A classe "Name_Of_My_Model" não foi definida como Pública nem Privada. Acontece que eu precisava definir o "Name_Of_My_Model" (class) como público para ser usado em um método "public" que tinha um decorador WebMethod acima dele para uma chamada ajax que eu estava fazendo.
Eric Milliot-Martinez
Ainda mais informações Restrições ao uso de níveis de acessibilidade (C #) #
Alexei Levenkov
1
E @ EricMilliot-Martinez, seu comentário me ajudou. Eu precisava adicionar Público a uma das minhas aulas também. Obrigado.
Fütemire 14/02
81

Torne a classe pública.

class NewClass
{

}

é o mesmo que:

internal class NewClass
{

}

então a turma tem que ser pública

Nisha
fonte
27

Se parece que o tipo ACTInterfacenão é public, mas está usando a acessibilidade padrão de internal(se for de nível superior) ou private(se estiver aninhado em outro tipo).

Dar ao tipo o publicmodificador o corrigia.

Outra abordagem é definir o tipo e o método internal, se essa for sua intenção.

O problema não é a acessibilidade do campo ( oActInterface), mas o ACTInterfacepróprio tipo .

Marc Gravell
fonte
9

Qual é a acessibilidade do tipo support.ACTInterface. O erro sugere que não é público.

Você não pode expor uma assinatura de método público onde alguns dos tipos de parâmetro da assinatura não são públicos. Não seria possível chamar o método de fora, pois o chamador não conseguiu construir os parâmetros necessários.

Se você tornar support.ACTInterfacepúblico isso removerá esse erro. Como alternativa, reduza a acessibilidade do método de formulário, se possível.

James Gaunt
fonte
4

O problema não parece estar com a variável, mas com a declaração do ACTInterface. O ACTInterface é declarado interno por acaso?

Craig W.
fonte
2

Quando recebi esse erro, eu tinha uma classe "auxiliar" que não declarava como pública que causava esse problema dentro da classe que usava a classe "auxiliar". Tornar pública a classe "auxiliar" resolveu esse erro, como em:

public ServiceClass {public ServiceClass (HelperClass _helper) {}}

public class HelperClass {} // Observe o HelperClass público que resolveu meu problema.

Isso pode ajudar alguém que encontra isso.

Keenan Stewart
fonte
2
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)' 

O erro diz 'support.ACTInterface' é menos acessível porque você tornou a interface privada, pelo menos a torne interna ou pública.

Harrish
fonte
1

Você pode obter o parâmetro (classe que tem menos acessibilidade) objecte convertê-lo em sua classe por aspalavra-chave.

Sadeq Shajary
fonte
Você não acha? você poderia ter adicionado isso como um comentário.
surajs1n
0

Se esse erro ocorrer quando você desejar usar uma variável de classe em um novo formulário, coloque a definição de classe no campo

Formname.Designer.cs

em vez do arquivo Formname.cs.

ltsstar
fonte
0

Após atualizar meu modelo de estrutura de entidade, encontrei esse erro infectando vários arquivos em minha solução. Simplesmente cliquei com o botão direito do mouse no meu arquivo .edmx e no meu arquivo TT e clique em "Executar ferramenta personalizada" e isso me fez voltar à direita depois de reiniciar o Visual Studio 2012.

Simon Kiely
fonte
-3

Tente tornar seu construtor privado assim:

private Foo newClass = new Foo();
Yousri Mousa
fonte
Na verdade não. Isso ocorre devido à proteção aninhada.
ForcedFakeLaugh