web-dev-qa-db-fra.com

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

J'essaie de passer un objet (une référence à l'utilisateur actuellement connecté) entre deux formulaires. Pour le moment, j'ai quelque chose de similaire 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 fait que je reçois:

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 via la méthode publique appropriée à partir du formulaire. Googler n'aide pas vraiment, car il indique simplement qu'un élément est public et l'autre privé, ce qui n'est pas le cas ici.

Quelqu'un aide?

173
dodgrile

Le constructeur de public class clients est public mais le paramètre ACTInterface est de type private (il est imbriqué dans une classe?). Tu ne peux pas faire ça. Vous devez rendre ACTInterface au moins aussi accessible que clients.

272
jason

Rendre la classe publique. 

class NewClass
{

}

est le même que:

internal class NewClass
{

}

donc la classe doit être publique 

54
Nisha

Si le son du type ACTInterface n'est pas public, il utilise l'accessibilité par défaut de internal (s'il s'agit du niveau supérieur) ou private (s'il est imbriqué dans un autre type).

Donner au type le modificateur public le corrigerait.

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

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

25
Marc Gravell

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 des types de paramètre de la signature ne sont pas publics. Il ne serait pas possible d'appeler la méthode de l'extérieur car l'appelant ne pouvait pas construire les paramètres requis.

Si vous rendez support.ACTInterface public, cette erreur sera supprimée. Vous pouvez également réduire l’accessibilité de la méthode du formulaire si possible.

8
James Gaunt

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

4
Craig W.

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

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

public class HelperClass {} // Notez le HelperClass public qui a résolu mon problème.

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

2
Keenan Stewart

Vous pouvez obtenir Parameter (classe ayant moins d'accessibilité) sous la forme object, puis le convertir en classe par le mot clé as.

0
Sadeq Shajary

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

Formname.Designer.cs

au lieu du fichier Formname.cs.

0
ltsstar

Après la mise à jour de mon modèle de structure d'entité, j'ai trouvé cette erreur infectant plusieurs fichiers de ma solution. J'ai simplement cliqué avec le bouton droit de la souris sur mon fichier .edmx et mon fichier TT, puis sur "Exécuter l'outil personnalisé", ce qui m'a redonné raison après le redémarrage de Visual Studio 2012.

0
Simon Kiely