2010-09-08 6 views
12

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

//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 file

private List<Method> pMethods; 

и

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

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

public Method AddMethod(string aName) 

и

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

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

public Method AddMethod(string aName) 

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

Любые идеи?

Подлежит редактированию. может ли быть какая-то настройка в файле, которая вызывает это?

+1

Это что-то меняет, если вы объявляете основные классы явно публичными? – Bobby

+0

Конструктор 'Property' ссылается на поле' pPropertyAttributes', которого не существует. Вы явно не опубликовали код, который создает ошибки, которые вы требуете. – Timwi

+0

Является ли это ошибкой с копированием, что в конце определения FBlock отсутствует}? Поскольку он в настоящее время указан, первая декларация пространства имен не закрыта. – epotter

ответ

7

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

+3

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

2

Код, который вы отправили, не приводит к сообщениям об ошибках, которые вы указали. Вы должны предоставить (небольшой) пример, который действительно показывает проблему.

+2

Разве это не комментарий? – NullUserException

+3

@NullUserException: Я считал это, но в его нынешнем виде это на самом деле ответ на вопрос :) – Timwi

0

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

+0

Если это так, то компилятор будет жаловаться на это в объявлении интерфейса. – Timwi

+0

Я знаю, но, как вы указываете, данный код не дает ошибок, поэтому что-то, очевидно, было опущено из вопроса. Как я уже сказал, просто (образованная) догадка. – Bubblewrap

+0

Он не существует ни в одном из общедоступных интерфейсов, которые реализует FBlock. Я включил весь код, какой-либо из ссылок на ошибки. Я не включил весь код, потому что это сделало бы действительно, очень длинный вопрос. Весь код, который я добавил с момента последнего компиляции, включен в вопрос. – scott

2

Все ваши классы internal по умолчанию

Marking public не сделать трюк.

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

+3

Не вложенные классы не могут быть защищены. По умолчанию они являются «внутренними». – Timwi

+0

Эй, ты прав .. Узнал другое сегодня! – Arcturus

+0

все три класса находятся в одной и той же сборке. Значит, они не должны быть публичными, верно? – scott

20

Первое, попробуйте полное восстановление. Очистите и создайте (или просто используйте перестроить). Каждый раз в течение долгого времени, что решает странные проблемы сборки для меня.

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

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

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

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

+2

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

2

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

4

Попробуйте добавить следующий код к классу, который вы хотите использовать

[Serializable()] 
public partial class Class 
{ 
0

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

Budi

Смежные вопросы