类因其保护级别而无法访问。

17

我有三个类,它们都属于同一个命名空间。以下是这三个类的基础知识。

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

将Method类设为public并不能解决错误。当调用Property类时却不会出现错误,我不明白为什么。而且我也不知道为什么将Method类设为public无法解决问题。

有任何想法吗?

编辑后再问一下,可能是文件上的某些设置导致了这个问题吗?


1
如果您明确将主要类声明为public,是否会改变什么? - Bobby
Property 构造函数引用了一个不存在的字段 pPropertyAttributes。你显然没有发布产生错误的代码。 - Timwi
FBlock定义末尾缺少}是复制粘贴错误吗?目前列出的第一个命名空间声明未关闭。 - epotter
timwi,Property类中没有任何错误。我只包含它是因为FBlock类中的addProperty方法不会导致任何错误,并且据我所知,具有与Method类相同的访问级别。因为该类非常长并且对问题没有任何帮助,所以我将其大大简化了。如果您认为这会有所帮助,我可以完整地添加它。 - scott
epotter,复制粘贴错误是从复制到问题中出现的。我从FBlock类中剪切了很多内容,因为它很长,与问题无关。 - scott
显示剩余3条评论
9个回答

22

首先,尝试进行完整的重建。清理并构建项目(或者直接使用重构)。偶尔这可以解决我遇到的一些奇怪的构建问题。

接下来,注释掉除了你发布的示例以外的所有代码。编译。这样会成功吗?

如果成功了,请逐步添加代码段,直到出现错误为止。

如果不成功,请将所有类都设为public并重新尝试。

如果仍然失败,可以尝试将简化后的类放在同一个文件中,然后重新构建。此时,访问问题就完全没有理由存在了。如果这样仍然失败,那就去学习木工吧。


3
令我惊讶的是,这个(重建)对我起了作用。我猜我已经不再期望增量构建出现问题了 :( - Legolas
谢谢... Clean 显示了另外一些之前没有显示过的类似错误,而 Build 则将它们清除掉了。 - Marcelo Scofano Diniz

7

有一个项目使用了链接文件。由于FBlock.cs文件已经存在,我需要将method.cs文件作为链接文件添加到该项目中。我以前从未听说过链接文件,甚至不知道这是可能的。


4
在Visual Studio中,添加链接文件的选项是相当隐蔽的。如果有人在搜索它,可以在“添加现有文件”对话框中找到,其中“添加”按钮有一个小箭头,可以将文件添加为链接而不是复制它。 - Julien Roncaglia

4

尝试将以下代码添加到您要使用的类中

[Serializable()]
public partial class Class
{

3
可能的情况是,包含相关类的库没有正确地使用强名称进行签名。

2
您发布的代码并没有产生您引用的错误信息。请提供一个实际展示问题的(小)示例。

3
@NullUserException:我考虑过了,但按照现在的情况来看,实际上这就是问题的答案 :) - Timwi

2

默认情况下,你所有的类都是 internal 的。

将其标记为 public 并不能解决问题。

你确定没有两个叫做 Method 的类,或者可能包含错误的 Method 类吗?


3
非嵌套类无法被声明为protected,它们默认为internal - Timwi
这三个类都在同一个程序集中,所以它们不需要是公共的,对吗? - scott
正确。这是一个奇怪的问题,正如其他人所说,我也无法重现它,因此我认为问题出在其他地方。 - Arcturus
我刚刚搜索了整个解决方案,只有一个Method类,当我将鼠标悬停在声明上时,它显示正确的命名空间。 - scott

0

你好,你需要将按钮属性从私有改为公共。

你可以在按钮下方更改属性 >> 设计 >> 修饰符 >> “公共”

一旦更改,保护错误就会消失。

致敬,Budi


0

我猜测 public Method AddMethod(string aName) 是在一个 FBlock 实现的公共接口上定义的。使用该接口的消费者不能保证能够访问 Method。


如果是这种情况,编译器会在接口声明中报错。 - Timwi
我知道,但正如你所指出的,给定的代码没有错误,因此问题显然省略了某些内容。就像我说的那样,这只是一个(有根据的)猜测。 - Bubblewrap
它不存在于FBlock实现的任何公共接口中。我已经包含了所有与错误相关的代码。我没有包含所有的代码,因为这会导致一个非常非常长的问题。自上次编译以来我添加的所有代码都包含在问题中。 - scott

0
你的类应该是公共的。
公共类 FBlock : IDesignRegionInserts、IFormRegionInserts、IAPIRegionInserts、IConfigurationInserts、ISoapProxyClientInserts、ISoapProxyServiceInserts。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接