Поделиться через


Ограничения на использование уровней доступности (справочник по 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#.

См. также