为什么无法显式声明命名空间中定义的元素?

时间:2012-02-06 09:29:24

标签: c# access-modifiers

我有以下C#代码:

namespace ISeeOptic.BL
{

  public abstract class Process
  {        
     ...      

     protected static void DeleteImages(List<ImagesPath> list)
      {
          some logic
      } 

      ...
   }


    protected class GetDataBL: Process
    {
      ...

     public static void DeleteImages(List<ImagesPath> list)
     {
         DeleteImages(list); 
     } 
     ...
 }
} 

在编译时我收到以下错误:

命名空间中定义的元素无法显式声明为private,protected或protected internal

我是C#的初学者所以也许这个问题可能看起来很幼稚, 知道导致这个错误的原因是什么?

谢谢你提前。

5 个答案:

答案 0 :(得分:33)

命名空间中定义的元素可以显式声明为public或internal。

它们可能不会被显式声明为私有或受保护(或受保护的内部),因为这些修饰符仅对类的成员有意义。

例如,你的protected class GetDataBL毫无意义,因为“protected”意味着“从包含类继承的类可以访问” - 但是没有包含GetDataBL的类。

答案 1 :(得分:12)

private protected表示此类或派生类可以访问它们    在命名空间级别,没有派生的类,所以它没用。

您只能在public级别使用internalNamespace

MSDN docs

答案 2 :(得分:8)

(我相信你实际上会得到一个编译时错误;如果你只是在执行时看到这个,那么你的代码也可能在执行时被编译,例如as Web应用程序的一部分。从逻辑上讲,它是编译时错误,不是例外。)

protected访问修饰符(松散地)使派生的包含类型可以访问成员;但在名称空间成员的情况下, 不包含类型。

同样,私有成员的辅助功能域是包含类型的程序文本 - 同样, 不包含类型。

通过使GetDataBL受到保护,您实际上想要实现的是什么?

答案 3 :(得分:3)

正如错误所解释的那样导致错误的元素的范围 - 以及C#规范(ECMA第10.5.1节):

  
      
  • 在编译单元或名称空间中声明的类型可以publicinternal声明可访问性,并且默认为internal声明的可访问性。
  •   
  • 类成员可以具有五种声明的可访问性中的任何一种,并且默认为private声明的可访问性。
  •   
  • 结构成员可以publicinternalprivate声明可访问性,并且默认为private声明的可访问性,因为结构是隐式密封的。
  •   

答案 4 :(得分:1)

在类Private,受保护和受保护的内部访问中,在命名空间级别不允许使用说明符。

只有允许的说明者在课堂上是公开的和内部的。

仅允许子类使用private,protected或protected内部访问说明符。

示例代码

internal class ParentClass
{
    public string test()
    {
        return "This is the parent class function";
    }
    private class BaseChildClass
    {
        protected string childtest()
        {
            return "This is the parent class function";
        }
    }

    private class DerivedChildClass : BaseChildClass
    {
        private void test1()
        {
            string test = base.childtest();

        }
    }
}