Класс недоступен из-за уровня защиты

У меня есть три класса. все являются частью одного и того же пространства имен. Вот основы трех классов.

//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);
         }
     }
}

Я получаю следующие ошибки

StubGenerator.PropGenerator.Method недоступен из-за уровня защиты

которая ссылается на следующую строку в файле FBlock.cs

private List<Method> pMethods;

а также

StubGenerator.PropGenerator.Method недоступен из-за уровня защиты

которая ссылается на следующую строку в файле FBlock.cs

 public Method AddMethod(string aName)

а также

Непоследовательная доступность: тип возвращаемого значения 'StubGenerator.PropGenerator.Method' менее доступен, чем метод 'StubGenerator.PropGenerator.FBlock.AddMethod (string)'

которая ссылается на следующую строку в файле FBlock.cs

 public Method AddMethod(string aName)

сделав метод класса публичным, ошибки не устраняются. Я не могу понять, почему я не получаю ошибки при вызове класса Property. И я не понимаю, почему обнародование класса Method не решает проблему.

Есть идеи?

Отредактировано, чтобы спросить. Может ли быть какой-то параметр в файле, который вызывает это?

 Timwi08 сент. 2010 г., 15:28
Property конструктор ссылается на полеpPropertyAttributes этого не существует Вы явно не опубликовали код, который приводит к ошибкам, на которые вы претендуете.
 Ben Voigt08 сент. 2010 г., 16:40
В C # пространства имен никак не влияют на доступ.internal не эквивалентен Javapackage доступ. Все ли эти файлы в одном проекте?
 scott08 сент. 2010 г., 16:49
Я так и думал. по-видимому, 2 из них были также в другом проекте в виде связанных файлов. Вот где и оказалась актуальная проблема. Мне пришлось добавить method.cs в другой проект в виде связанного файла.
 scott08 сент. 2010 г., 15:50
timwi, в классе Property нет ошибок. Я включил его только потому, что метод addProperty в классе FBlock не вызывает никаких ошибок и, насколько я могу судить, имеет тот же уровень доступа, что и класс Method. Я много вырезал из этого класса, потому что он довольно длинный и ничего не добавляет к вопросу. Я могу добавить это полностью, если вы думаете, что это поможет.
 funkymushroom01 нояб. 2018 г., 18:16
У меня была точно такая же ошибка, за исключением того, что в моем случае она была создана на моей локальной машине, но не на нашем сервере сборки. Проблема оказалась ссылкой на DLL, которая, хотя она существовала на обеих машинах, была указана через относительный путь внутри файла csproj. Когда я вручную отредактировал файл csproj и преобразовал ссылку на dll для использования абсолютного пути (который был одинаковым на обеих машинах), эта проблема исчезла.
 epotter08 сент. 2010 г., 15:29
Это ошибка вставки копии, которая отсутствует в конце определения FBlock? Как это в настоящее время перечислено, первое объявление пространства имен не закрыто.
 scott08 сент. 2010 г., 15:51
epotter, ошибка копирования-вставки была из копии в вопрос. Я много вырезал из класса FBlock, потому что он длинный и не имеет ничего общего с вопросом.
 Bobby08 сент. 2010 г., 15:21
Изменит ли это что-то, если вы объявите основные классы явно как публичные?

Ответы на вопрос(8)

Решение Вопроса

который использовал связанные файлы. Мне нужно было добавить файл method.cs в этот проект также как связанный файл, так как там был файл FBlock.cs. Я никогда не слышал о связанных файлах раньше, я даже не знал, что это возможно.

 Julien Roncaglia08 сент. 2010 г., 16:44
Да, опция добавления связанных файлов довольно хорошо спрятана в visual studio. Если кто-то ищет его, он находится в диалоговом окне добавления существующего файла, кнопка «Добавить» имеет небольшую стрелку, чтобы добавить файл в качестве ссылки вместо его копирования.

internal по умолчанию

маркировкаpublic не сделал трюк.

Вы уверены, что у вас нет двух классов с именем Method, и, возможно, вы используете неправильный класс Method?

 scott08 сент. 2010 г., 15:37
Все три класса находятся в одной сборке. Так что они не должны быть публичными, верно?
 Arcturus08 сент. 2010 г., 15:27
Эй, ты прав .. Узнал еще одну вещь сегодня!
 Arcturus08 сент. 2010 г., 15:55
Правильный. Это странная проблема, и, как утверждают некоторые, я тоже не могу ее воспроизвести, поэтому я думаю, что проблема кроется где-то еще.
 scott08 сент. 2010 г., 16:02
Я только что проверил все решение, есть только один класс Method, и когда я нащупываю объявление, оно показывает правильное пространство имен.
 Timwi08 сент. 2010 г., 15:22
Не вложенные классы не могут быть защищены. Они естьinternal по умолчанию.

можете изменить Под кнопкой >> Свойства >> Дизайн >> Модификаторы >> «Публичный». После изменения ошибка защиты исчезнет.

Буди

попробуйте полную перестройку. Очистить и собрать (или просто использовать перестроить). Время от времени это решает причудливые проблемы со сборкой для меня.

Затем закомментируйте оставшуюся часть кода, который отсутствует в вашем примере, который вы опубликовали. Компиляция. Это работает?

Если так, начните добавлять сегменты назад, пока один не сломает это.

Если нет, сделайте все классыpublic и попробуй еще раз.

Если это по-прежнему не удается, возможно, попробуйте поместить урезанные классы в тот же файл и перестроить. На этом этапе не было бы абсолютно никаких причин для проблем с доступом. Если это все еще не удается, заняться столярным делом.

 Legolas25 июл. 2015 г., 16:36
К моему удивлению, это (перестройка) сработало для меня. Я думаю, что я перестал ожидать, что инкрементные сборки будут портить :(

который вы хотите использовать

[Serializable()]
public partial class Class
{

public Method AddMethod(string aName) определяется на общедоступном интерфейсе, который реализует FBlock. Потребителям этого интерфейса не гарантируется доступ к методу.

 Timwi08 сент. 2010 г., 15:23
Если бы это было так, компилятор жаловался бы на это в объявлении интерфейса.
 Bubblewrap08 сент. 2010 г., 15:24
Я знаю, но, как вы указываете, данный код не дает ошибок, поэтому что-то явно было опущено в вопросе. Как я уже сказал, просто (образованное) предположение.
 scott08 сент. 2010 г., 15:44
Он не существует ни в одном из открытых интерфейсов, которые реализует FBlock. Я включил весь код, на который ссылается любая из ошибок. Я не включил весь код, потому что это сделало бы действительно очень длинный вопрос. Весь код, который я добавил с момента его последней компиляции, включен в вопрос.

которые вы цитировали. Вы должны предоставить (маленький) пример, который действительно демонстрирует проблему.

 NullUserException08 сент. 2010 г., 16:41
Разве это не должно быть комментарием?
 Timwi08 сент. 2010 г., 17:01
@NullUserException: я обдумал это, но в его нынешнем виде это на самом деле ответ на вопрос :)

что библиотека, содержащая рассматриваемый класс, не будет должным образом подписана строгим именем.

Ваш ответ на вопрос