Ограничения на использование уровней доступности (справочник по C#)
При задании типа в объявлении необходимо проверить, зависит ли уровень доступности типа от уровня доступности члена или другого типа. Например, прямой базовый класс должен иметь по крайней мере такой же уровень доступности, как и производный класс. Следующие объявления вызывают ошибку компиляции, так как базовый класс BaseClass
менее доступен, чем MyClass
:
class BaseClass {...}
public class MyClass: BaseClass {...} // Error
В таблице ниже приведены все ограничения на объявленные уровни доступности.
Контекст | Замечания |
---|---|
Классы | Прямой базовый класс для типа класса должен иметь по крайней мере такой же уровень доступности, как и сам тип класса. |
Интерфейсы | Явные базовые интерфейсы для типа интерфейса должны иметь по крайней мере такой же уровень доступности, как и сам тип интерфейса. |
Делегаты | Тип возвращаемого значения и типы параметров для типа делегата должны иметь по крайней мере такой же уровень доступности, как и сам тип делегата. |
Константы | Тип константы должен иметь по крайней мере такой же уровень доступности, как и сама константа. |
Поля | Тип поля должен иметь по крайней мере такой же уровень доступности, как и само поле. |
Методы | Тип возвращаемого значения и типы параметров для метода должны иметь по крайней мере такой же уровень доступности, как и сам метод. |
Свойства | Тип свойства должен иметь по крайней мере такой же уровень доступности, как и само свойство. |
События | Тип события должен иметь по крайней мере такой же уровень доступности, как и само событие. |
Индексаторы | Тип и типы параметров для индексатора должны иметь по крайней мере такой же уровень доступности, как и сам индексатор. |
Операторы | Тип возвращаемого значения и типы параметров для оператора должны иметь по крайней мере такой же уровень доступности, как и сам оператор. |
Конструкторы | Типы параметров для конструктора должны иметь по крайней мере такой же уровень доступности, как и сам конструктор. |
Пример
В приведенном ниже примере содержатся ошибочные объявления различных типов. В комментарии после каждого объявления указывается предполагаемая ошибка компиляции.
// Restrictions on Using Accessibility Levels
// CS0052 expected as well as CS0053, CS0056, and CS0057
// To make the program work, change access level of both class B
// and MyPrivateMethod() to public.
using System;
// A delegate:
delegate int MyDelegate();
class B
{
// A private method:
static int MyPrivateMethod()
{
return 0;
}
}
public class A
{
// Error: The type B is less accessible than the field A.myField.
public B myField = new B();
// Error: The type B is less accessible
// than the constant A.myConst.
public readonly B myConst = new B();
public B MyMethod()
{
// Error: The type B is less accessible
// than the method A.MyMethod.
return new B();
}
// Error: The type B is less accessible than the property A.MyProp
public B MyProp
{
set
{
}
}
MyDelegate d = new MyDelegate(B.MyPrivateMethod);
// Even when B is declared public, you still get the error:
// "The parameter B.MyPrivateMethod is not accessible due to
// protection level."
public static B operator +(A m1, B m2)
{
// Error: The type B is less accessible
// than the operator A.operator +(A,B)
return new B();
}
static void Main()
{
Console.Write("Compiled successfully");
}
}
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.