Почему элементы, определенные в пространстве имен не могут быть явно объявлены?

У меня есть следующий код 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); 
     } 
     ...
 }
} 

во время компиляции я получаю следующую ошибку:

элементы, определенные в пространстве имен не могут быть явно объявлены как частные, защищенные или защищенные внутренние

Я новичок в C#, поэтому, возможно, этот вопрос может показаться наивным, есть идеи, что послужило причиной этой ошибки?

спасибо заранее.

5 ответов


элементы, определенные в пространстве имен, могут быть явно объявлены открытыми или внутренними.

они не могут быть явно объявлены как private или protected (защищенный или внутренний), поскольку эти модификаторы имеют смысл только для членов класса.

код protected class GetDataBL, например, не имеет смысла, потому что" защищенный "означает" доступный для классов, которые наследуют от содержащего класса " - но нет содержащего класса для GetDataBL.


private protected означает, что они будут доступны этому классу или производным классам.
На уровне пространства имен нет класса, производного от so it useless.

вы можете использовать только public или internal на Namespace уровень

документы MSDN


(Я считаю, что вы действительно получите ошибку времени компиляции; если вы только видим это во время выполнения, то, скорее всего, ваш код компилируется во время выполнения, например, как часть веб-приложения. Логически это-ошибка времени компиляции, а не исключение.)

на protected модификатор доступа (свободно) делает член доступным для производного содержащего типа; но в случае члена пространства имен там is не содержащего типа.

аналогично a домен доступности частного участника - это текст программы содержащего типа - и опять же, там is не содержащего типа.

что вы на самом деле пытаетесь достижения делая GetDataBL защищать?


это область действия элементов, которая вызывает ошибку, как объясняется ошибкой-и спецификацией C# (раздел ECMA 10.5.1):

  • типы, объявленные в единицах компиляции или пространствах имен, могут иметь public или internal объявленная доступность и значение по умолчанию internal объявлена доступность.
  • члены класса могут иметь любой из пяти видов декларируемой доступности и по умолчанию private объявлена доступность.
  • члены структуры могут иметь public, internal или private объявленная доступность и значение по умолчанию private объявленная доступность, потому что структуры неявно запечатаны.

в классе частные, защищенные и защищенные спецификаторы внутреннего доступа не разрешены на уровне пространства имен.

только разрешенные спецификаторы являются открытыми и внутренними в классе.

разрешены только для дочерних классов частные, защищенные или защищенные спецификаторы внутреннего доступа.

пример кода

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();

        }
    }
}