web-dev-qa-db-fra.com

La classe est inaccessible en raison de son niveau de protection

J'ai trois classes. tous font partie du même espace de noms. voici les bases des trois classes.

//FBlock.cs
namespace StubGenerator.PropGenerator
{
    class FBlock : IDesignRegionInserts, IFormRegionInserts, IAPIRegionInserts,  IConfigurationInserts, ISoapProxyClientInserts, ISoapProxyServiceInserts
    {
        private List<Property> pProperties;
        private List<Method> pMethods;
        public FBlock(string aFBlockName)
        { 
            pProperties = new List<Property>();
            pMethods = new List<Method>();
        }

        public Property AddProperty(string aName)
        {
            Property loProp = new Property(this, aName, pProperties.Count);
            pProperties.Add(loProp);
            return loProp;
         }

         public Method AddMethod(string aName)
         {
             Method loMeth = new Method(this, aName);
             pMethods.Add(loMeth);
             return loMeth;
         }
     }

 //Method.cs
 namespace StubGenerator.PropGenerator
 {
     class Method : IPropertyName
     {
         private List<StubGenerator.PropGenerator.PropertyAttribute> pPropertyAttributes;
         private string pName;
         private string pFBlockName;

         public Method(FBlock aFBlock,string aName)
         {
             pPropertyAttributes = new List<PropertyAttribute>();
             pName = aName;
             pFBlockName = aFBlock.Name;
         }
      }
 }

 //Property.cs
 namespace StubGenerator.PropGenerator
 {
    class Property : StubGenerator.PropGenerator.IPropertyName, StubGenerator.PropGenerator.IDesignRegionInserts, StubGenerator.PropGenerator.IFormRegionInserts, IAPIRegionInserts, IConfigurationInserts, ISoapProxyClientInserts, ISoapProxyServiceInserts
    {
        private string pName;
        private string pExpandedName;
        private string pFBlockInitials;

        private Group pPropertyGroup;
        private FlowLayoutPanel pGroupFlowPanel;
        private Button pUpdateButton;
        private CheckBox pShowProperty;


         private string pFBlockName;


         public Property(FBlock aFBlock, string aName, int aIndex)
         {
             pPropertyAttributes = new List<PropertyAttribute>();
             pFBlockName = aFBlock.FBlockName;

             ExpandName();
             GetInitials();

             pShowProperty = new CheckBox(this, 10, (aIndex + 1) * 20, aIndex);
             pPropertyGroup = new Group(this);
             pGroupFlowPanel = new FlowLayoutPanel(this);

             pUpdateButton = new Button(this, 10, 18, aIndex);
         }
     }
}

Je reçois les erreurs suivantes

'StubGenerator.PropGenerator.Method' est inaccessible en raison de son niveau de protection

qui fait référence à la ligne suivante dans le fichier FBlock.cs

private List<Method> pMethods;

et

'StubGenerator.PropGenerator.Method' est inaccessible en raison de son niveau de protection

qui fait référence à la ligne suivante dans le fichier FBlock.cs

 public Method AddMethod(string aName)

et

Accessibilité incohérente: le type de retour 'StubGenerator.PropGenerator.Method' est moins accessible que la méthode 'StubGenerator.PropGenerator.FBlock.AddMethod (string)'

qui fait référence à la ligne suivante dans le fichier FBlock.cs

 public Method AddMethod(string aName)

rendre la méthode de classe publique ne résout pas les erreurs. Je ne peux pas comprendre pourquoi je n'obtiens pas les erreurs lors de l'appel de la classe Property. Et je ne comprends pas pourquoi rendre la classe Method publique ne résout pas le problème.

Des idées?

Édité pour demander. pourrait-il y avoir un paramètre sur le fichier qui provoque cela?

14
scott

Il y avait un projet qui utilisait des fichiers liés. J'ai également dû ajouter le fichier method.cs à ce projet en tant que fichier lié, car le fichier FBlock.cs était là. Je n'avais jamais entendu parler de fichiers liés auparavant, je ne savais même pas que c'était possible.

7
scott

Tout d'abord, essayez une reconstruction complète. Nettoyez et construisez (ou utilisez simplement la reconstruction). De temps en temps, cela résout des problèmes de construction bizarres pour moi.

Ensuite, commentez le reste du code qui ne se trouve pas dans votre exemple que vous avez publié. Compiler. Est-ce que ça marche?

Si c'est le cas, commencez à ajouter des segments jusqu'à ce que l'un d'eux le casse.

Sinon, créez toutes les classes public et réessayez.

Si cela échoue toujours, essayez peut-être de mettre les classes réduites dans le même fichier et de les reconstruire. À ce stade, il n'y aurait absolument aucune raison de problèmes d'accès. Si cela échoue toujours, commencez la menuiserie.

21
Andy_Vulhop

Essayez d'ajouter le code ci-dessous à la classe que vous souhaitez utiliser

[Serializable()]
public partial class Class
{
4
Gabriela

Il se peut également que la bibliothèque contenant la classe en question ne soit pas correctement signée avec un nom fort.

3
Alexey

Le code que vous avez publié ne produit pas les messages d'erreur que vous avez cités. Vous devez fournir un (petit) exemple qui présente réellement le problème.

2
Timwi

Toutes vos classes sont internal par défaut

Marquer public n'a pas fait l'affaire.

Êtes-vous sûr de ne pas avoir deux classes nommées Method, et peut-être incluez-vous la mauvaise classe Method?

2
Arcturus

Je suppose que public Method AddMethod(string aName) est défini sur une interface publique que FBlock implémente. Les consommateurs de cette interface ne sont pas garantis d'avoir accès à Method.

0
Bubblewrap

Salut Vous devez changer les propriétés du bouton de privé à public. Vous pouvez changer sous le bouton >> propriétés >> Conception >> Modificateurs >> "public" Une fois le changement fait, l'erreur de protection disparaîtra.

Budi

0
Budi