Accessibilité incohérente: le type de paramètre est moins accessible que la méthode

227

J'essaie de passer un objet (une référence à l'utilisateur actuellement connecté, essentiellement) entre deux formulaires. Pour le moment, j'ai quelque chose dans ce sens dans le formulaire de connexion:

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

sur le formulaire suivant (clients), j'ai:

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

    public clients(ACTInterface _oActInt)

... ce qui me fait obtenir:

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

Je ne comprends pas vraiment quel est le problème - les deux champs sont privés et accessibles par la méthode publique appropriée à partir du formulaire. La recherche sur Google n'aide pas vraiment, car elle indique simplement qu'un élément est public et l'autre privé, ce qui n'est pas le cas ici.

Quelqu'un vous aide?

dodgrile
la source

Réponses:

353

Le constructeur de la publicclasse clientsest publicmais il a un paramètre de type ACTInterfacequi est private(il est imbriqué dans une classe?). Tu ne peux pas faire ça. Vous devez rendre ACTInterfaceau moins aussi accessible que clients.

Jason
la source
2
Pour plus d'informations, consultez l'article MSDN sur l'erreur CS0051
Alexei Levenkov
5
Cela m'a aidé. J'essayais de faire ce qui suit: JsonConvert.DeserializeObject <List <Name_Of_My_Model>> (response.Content.ReadAsStringAsync (). Result); La classe "Name_Of_My_Model" n'a pas été définie sur Public ou Private. Il s'est avéré que J'AI BESOIN de définir "Name_Of_My_Model" (classe) sur public pour être utilisé dans une méthode "publique" qui avait un décorateur WebMethod au-dessus pour un appel ajax que je faisais.
Eric Milliot-Martinez
Encore plus d'informations Restrictions sur l'utilisation des niveaux d'accessibilité (C #)
Alexei Levenkov
1
Et @ EricMilliot-Martinez, votre commentaire m'a aidé. J'avais également besoin d'ajouter Public à l'une de mes classes. Merci.
Fütemire
81

Rendez la classe publique.

class NewClass
{

}

est le même que:

internal class NewClass
{

}

donc la classe doit être publique

Nisha
la source
27

Si sonne comme le type ACTInterfacene l'est pas public, mais utilise l'accessibilité par défaut de internal(s'il est de niveau supérieur) ou private(s'il est imbriqué dans un autre type).

Donner au type le publicmodificateur le corrigerait.

Une autre approche consiste à définir à la fois le type et la méthode internal, si telle est votre intention.

Le problème n'est pas l'accessibilité du champ ( oActInterface), mais plutôt du type ACTInterfacelui-même.

Marc Gravell
la source
9

Quelle est l'accessibilité du type support.ACTInterface. L'erreur suggère que ce n'est pas public.

Vous ne pouvez pas exposer une signature de méthode publique lorsque certains types de paramètres de la signature ne sont pas publics. Il ne serait pas possible d'appeler la méthode de l'extérieur car l'appelant n'a pas pu construire les paramètres requis.

Si vous rendez support.ACTInterfacepublic cela supprimera cette erreur. Vous pouvez également réduire l'accessibilité de la méthode de formulaire si possible.

James Gaunt
la source
4

Le problème ne semble pas être lié à la variable mais plutôt à la déclaration d'ACTInterface. ACTInterface est-il déclaré comme interne par hasard?

Craig W.
la source
2

Lorsque j'ai reçu cette erreur, j'avais une classe "helper" que je n'ai pas déclarée publique qui a causé ce problème à l'intérieur de la classe qui utilisait la classe "helper". Rendre la classe "helper" publique a résolu cette erreur, comme dans:

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

classe publique HelperClass {} // Notez la HelperClass publique qui a résolu mon problème.

Cela peut aider quelqu'un d'autre qui rencontre cela.

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

L'erreur indique que «support.ACTInterface» est moins accessible car vous avez rendu l'interface privée, au moins la rendre interne ou la rendre publique.

Harrish
la source
1

Vous pouvez obtenir Parameter (classe qui a moins d'accessibilité), objectpuis le convertir en votre classe par asmot-clé.

Sadeq Shajary
la source
Tu ne crois pas? vous auriez pu l'ajouter en tant que commentaire.
surajs1n
0

Si cette erreur se produit lorsque vous souhaitez utiliser une variable de classe dans un nouveau formulaire, vous devez placer la définition de classe dans le

Formname.Designer.cs

au lieu du fichier Formname.cs.

ltsstar
la source
0

Après avoir mis à jour mon modèle de structure d'entité, j'ai trouvé cette erreur infectant plusieurs fichiers dans ma solution. J'ai simplement fait un clic droit sur mon fichier .edmx et mon fichier TT et cliquez sur "Exécuter l'outil personnalisé" et cela m'a de nouveau eu raison après un redémarrage de Visual Studio 2012.

Simon Kiely
la source
-3

Essayez de rendre votre constructeur privé comme ceci:

private Foo newClass = new Foo();
Yousri Mousa
la source
Pas vraiment. Cela est dû à la protection imbriquée.
ForcedFakeLaugh