Подтвердить что ты не робот

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

У меня есть следующий код С#:

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Чего вы на самом деле пытаетесь достичь, создав GetDataBL protected?

Ответ 3

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

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

Документы MSDN

Ответ 4

Это область определения элементов, вызывающих ошибку, как объясняется ошибкой, и спецификацию С# (раздел 10.1.1 ECMA):

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

Ответ 5

В классах Private, Protected и Protected Internal Access Спецификаторы не допускаются на уровне пространства имен.

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

Только для дочерних классов допускаются закрытые, защищенные или защищенные внутренние права доступа.

Пример кода

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

        }
    }
}