Почему элементы, определенные в пространстве имен, не могут быть объявлены явно? - PullRequest
34 голосов
/ 06 февраля 2012

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

34 голосов
/ 06 февраля 2012

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

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

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

12 голосов
/ 06 февраля 2012

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

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

Документы MSDN

8 голосов
/ 06 февраля 2012

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

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

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

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

3 голосов
/ 06 февраля 2012

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

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

В классе Закрытый, Защищенный и Защищенный внутренний доступ. Спецификаторы недопустимы на уровне пространства имен.

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

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

Пример кода

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

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...