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


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

См. также