Accessibilità incoerente: il tipo di parametro è meno accessibile del metodo


227

Sto provando a passare un oggetto (in sostanza un riferimento all'utente attualmente connesso) tra due moduli. Al momento, ho qualcosa del genere nel modulo di accesso:

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...

nel modulo successivo (clienti), ho:

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

    public clients(ACTInterface _oActInt)

... che mi fa ottenere:

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

Non capisco davvero quale sia il problema: entrambi i campi sono privati ​​e accessibili tramite il metodo pubblico pertinente dal modulo. Googling non aiuta davvero, in quanto indica solo che un elemento è pubblico e l'altro privato, il che non è il caso qui.

Qualcuno mi aiuti?

Risposte:


353

Costruttore di publicclasse clientsè publicma ha un parametro di tipo ACTInterfaceche è private(è nidificato in una classe?). Non puoi farlo. Devi rendere ACTInterfaceaccessibile almeno quanto clients.


2
Per ulteriori informazioni, consultare l'articolo MSDN sull'errore CS0051
Alexei Levenkov,

5
Questo mi ha aiutato. Stavo provando a fare quanto segue: JsonConvert.DeserializeObject <List <Name_Of_My_Model>> (response.Content.ReadAsStringAsync (). Risultato); La classe "Name_Of_My_Model" non è stata impostata su Pubblico o Privato. Ho scoperto che HO BISOGNO di impostare "Name_Of_My_Model" (classe) su pubblico per usarlo in un metodo "pubblico" con sopra un decoratore WebMethod per una chiamata ajax che stavo facendo.
Eric Milliot-Martinez,

Ancora più informazioni Restrizioni
sull'uso dei

1
E @ EricMilliot-Martinez, il tuo commento mi ha aiutato. Avevo bisogno di aggiungere anche Public a una delle mie lezioni. Grazie.
Fütemire,

81

Rendi pubblica la classe.

class NewClass
{

}

equivale a:

internal class NewClass
{

}

quindi la classe deve essere pubblica


27

Se sembra che il tipo ACTInterfacenon lo sia public, ma utilizza l'accessibilità predefinita di internal(se è di livello superiore) o private(se è nidificato in un altro tipo).

Dando il tipo il publicmodificatore lo aggiusterà.

Un altro approccio è quello di rendere sia il tipo che il metodo internal, se questo è il tuo intento.

Il problema non è l'accessibilità del campo ( oActInterface), ma piuttosto del tipo ACTInterfacestesso.


9

Qual è l'accessibilità del tipo support.ACTInterface. L'errore suggerisce che non è pubblico.

Non è possibile esporre una firma del metodo pubblico in cui alcuni dei tipi di parametro della firma non sono pubblici. Non sarebbe possibile chiamare il metodo dall'esterno poiché il chiamante non è riuscito a costruire i parametri richiesti.

Se rendi support.ACTInterfacepubblico ciò rimuoverà questo errore. In alternativa, ridurre l'accessibilità del metodo del modulo, se possibile.


4

Il problema non sembra riguardare la variabile ma piuttosto la dichiarazione di ACTInterface. ACTInterface è dichiarato come interno per caso?


2

Quando ho ricevuto questo errore, ho avuto una classe "helper" che non ho dichiarato pubblico che ha causato questo problema all'interno della classe che ha utilizzato la classe "helper". Rendere pubblica la classe "helper" ha risolto questo errore, come in:

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

classe pubblica HelperClass {} // Nota la HelperClass pubblica che ha risolto il mio problema.

Questo può aiutare qualcun altro che lo incontra.


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

L'errore dice 'support.ACTInterface' è meno accessibile perché hai reso l'interfaccia come privata, almeno rendila interna o rendila pubblica.


1

Puoi ottenere Parameter (classe che ha meno accessibilità) e objectpoi convertirlo nella tua classe per asparola chiave.


Non pensi? avresti potuto aggiungere questo come commento.
surajs1n,

0

Se questo errore si verifica quando si desidera utilizzare una variabile di classe in un nuovo modulo, è necessario inserire la definizione della classe in

Formname.Designer.cs

anziché il file Formname.cs.


0

Dopo aver aggiornato il mio modello di framework di entità, ho riscontrato questo errore che infettava diversi file nella mia soluzione. Ho semplicemente fatto clic con il pulsante destro del mouse sul mio file .edmx e sul mio file TT e ho fatto clic su "Esegui strumento personalizzato" e questo mi ha riportato subito dopo il riavvio di Visual Studio 2012.


-3

Prova a rendere privato il tuo costruttore in questo modo:

private Foo newClass = new Foo();

Non proprio. Ciò è dovuto alla protezione nidificata.
ForcedFakeLaugh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.