Inkonsistente Zugänglichkeit: Der Parametertyp ist weniger zugänglich als die Methode

227

Ich versuche, ein Objekt (im Grunde genommen einen Verweis auf den aktuell angemeldeten Benutzer) zwischen zwei Formularen zu übergeben. Im Moment habe ich etwas in dieser Richtung im Anmeldeformular:

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

Auf dem nächsten Formular (Kunden) habe ich:

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

    public clients(ACTInterface _oActInt)

... was dazu führt, dass ich bekomme:

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

Ich verstehe das Problem nicht wirklich - beide Felder sind privat und werden über die entsprechende öffentliche Methode über das Formular aufgerufen. Googeln hilft nicht wirklich, da es nur darauf hinweist, dass ein Element öffentlich und das andere privat ist, was hier nicht der Fall ist.

Hilft jemand?

Dodgrile
quelle

Antworten:

352

Constructor der publicKlasse clientsist , publicaber es hat einen Parameter vom Typ ACTInterface, der ist private(in einer Klasse verschachtelt ist?). Das kannst du nicht machen. Sie müssen ACTInterfacemindestens so zugänglich machen wie clients.

Jason
quelle
2
Weitere Informationen finden Sie im MSDN-Artikel zum Fehler CS0051
Alexei Levenkov,
5
Das hat mir geholfen. Ich habe Folgendes versucht: JsonConvert.DeserializeObject <List <Name_Of_My_Model >> (response.Content.ReadAsStringAsync (). Result); Die Klasse "Name_Of_My_Model" wurde weder auf "Öffentlich" noch auf "Privat" gesetzt. Es stellte sich heraus, dass ich "Name_Of_My_Model" (Klasse) auf "public" setzen musste, um in einer "public" -Methode verwendet zu werden, über der sich ein WebMethod-Dekorator für einen von mir ausgeführten Ajax-Aufruf befand.
Eric Milliot-Martinez
1
Und @ EricMilliot-Martinez, Ihr Kommentar hat mir geholfen. Ich musste Public auch zu einer meiner Klassen hinzufügen. Vielen Dank.
Fütemire
81

Machen Sie die Klasse öffentlich.

class NewClass
{

}

ist das gleiche wie:

internal class NewClass
{

}

Die Klasse muss also öffentlich sein

Nisha
quelle
27

Wenn dies so klingt, als ob der Typ dies ACTInterfacenicht ist public, aber die Standardzugriffsmöglichkeit entweder internal(wenn es sich um die oberste Ebene handelt) oder private(wenn er in einem anderen Typ verschachtelt ist) verwendet.

Wenn Sie dem Typ den publicModifikator geben, wird dies behoben.

Ein anderer Ansatz besteht darin, sowohl den Typ als auch die Methode festzulegen internal , wenn dies Ihre Absicht ist.

Das Problem ist nicht die Zugänglichkeit des Feldes ( oActInterface), sondern des Typs ACTInterfaceselbst.

Marc Gravell
quelle
9

Was ist die Zugänglichkeit des Typs support.ACTInterface. Der Fehler deutet darauf hin, dass es nicht öffentlich ist.

Sie können keine öffentliche Methodensignatur verfügbar machen, wenn einige der Parametertypen der Signatur nicht öffentlich sind. Es wäre nicht möglich, die Methode von außen aufzurufen, da der Aufrufer die erforderlichen Parameter nicht erstellen konnte.

Wenn Sie dies veröffentlichen support.ACTInterface, wird dieser Fehler behoben. Alternativ können Sie die Zugänglichkeit der Formularmethode nach Möglichkeit verringern.

James Gaunt
quelle
4

Das Problem scheint nicht bei der Variablen zu liegen, sondern bei der Deklaration von ACTInterface. Wird ACTInterface zufällig als intern deklariert?

Craig W.
quelle
2

Als ich diesen Fehler erhielt, hatte ich eine "Helfer" -Klasse, die ich nicht als öffentlich deklariert habe und die dieses Problem innerhalb der Klasse verursacht hat, die die "Helfer" -Klasse verwendet hat. Durch die Veröffentlichung der "Helfer" -Klasse wurde dieser Fehler wie folgt behoben:

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

öffentliche Klasse HelperClass {} // Beachten Sie die öffentliche HelperClass, die mein Problem gelöst hat.

Dies kann jemand anderem helfen, der darauf stößt.

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

Der Fehler besagt, dass 'support.ACTInterface' weniger zugänglich ist, da Sie die Schnittstelle als privat, zumindest intern oder öffentlich gemacht haben.

Harrish
quelle
1

Sie können Parameter (Klasse mit geringerer Zugänglichkeit) objectabrufen, indem Sie ihn dann per asSchlüsselwort in Ihre Klasse konvertieren .

Sadeq Shajary
quelle
Denkst du nicht? Sie hätten dies als Kommentar hinzufügen können.
surajs1n
0

Wenn dieser Fehler auftritt, wenn Sie eine Klassenvariable in einem neuen Formular verwenden möchten, sollten Sie die Klassendefinition in das Feld einfügen

Formname.Designer.cs

anstelle der Datei Formname.cs.

ltsstar
quelle
0

Nach dem Aktualisieren meines Entity-Framework-Modells stellte ich fest, dass dieser Fehler mehrere Dateien in meiner Lösung infizierte. Ich habe einfach mit der rechten Maustaste auf meine .edmx-Datei und meine TT-Datei geklickt und auf "Benutzerdefiniertes Tool ausführen" geklickt. Nach einem Neustart von Visual Studio 2012 war ich wieder richtig.

Simon Kiely
quelle
-3

Versuchen Sie, Ihren Konstruktor folgendermaßen privat zu machen:

private Foo newClass = new Foo();
Yousri Mousa
quelle
Nicht wirklich. Dies ist auf verschachtelten Schutz zurückzuführen.
ForcedFakeLaugh