Почему элементы, определенные в пространстве имен, не могут быть явно объявлены?
У меня есть следующий код С#:
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);
}
...
}
}
Во время компиляции я получаю следующую ошибку:
Элементы, определенные в пространстве имен, не могут быть явно объявлены как закрытые, защищенные или защищенные внутренние
Я начинаю на С#, поэтому, возможно, этот вопрос может показаться наивным,
любая идея, в чем причина этой ошибки?
Спасибо заранее.
Ответы
Ответ 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();
}
}
}