Ograniczenia dotyczące używania poziomów ułatwień dostępu (odwołanie w C#)

Po określeniu typu w deklaracji sprawdź, czy poziom ułatwień dostępu typu zależy od poziomu ułatwień dostępu elementu członkowskiego lub innego typu. Na przykład bezpośrednia klasa bazowa musi być co najmniej tak dostępna, jak klasa pochodna. Następujące deklaracje powodują błąd kompilatora, ponieważ klasa BaseClass bazowa jest mniej dostępna niż MyClass:

class BaseClass {...}
public class MyClass: BaseClass {...} // Error

Poniższa tabela zawiera podsumowanie ograniczeń dotyczących zadeklarowanych poziomów ułatwień dostępu.

Kontekst Uwagi
Klasy Bezpośrednia klasa bazowa typu klasy musi być co najmniej tak dostępna, jak sam typ klasy.
Interfejsy Jawne interfejsy podstawowe typu interfejsu muszą być co najmniej tak dostępne, jak sam typ interfejsu.
Delegaci Zwracany typ i typy parametrów typu delegata muszą być co najmniej tak dostępne, jak sam typ delegata.
Stałe Typ stałej musi być co najmniej tak dostępny, jak sama stała.
Pola Typ pola musi być co najmniej tak dostępny, jak samo pole.
Metody Typ zwracany i typy parametrów metody muszą być co najmniej tak dostępne, jak sama metoda.
Właściwości Typ właściwości musi być co najmniej tak dostępny, jak sama właściwość.
Wydarzenia Typ zdarzenia musi być co najmniej tak dostępny, jak samo zdarzenie.
Indexers (Indeksatory) Typy typów i parametrów indeksatora muszą być co najmniej tak dostępne, jak sam indeksator.
Operatory Typ zwracany i typy parametrów operatora muszą być co najmniej tak dostępne, jak sam operator.
Konstruktory Typy parametrów konstruktora muszą być co najmniej tak dostępne, jak sam konstruktor.

Przykład

Poniższy przykład zawiera błędne deklaracje różnych typów. Komentarz po każdej deklaracji wskazuje oczekiwany błąd kompilatora.

// 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");
    }
}

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też