Dela via


Begränsningar för användning av hjälpmedelsnivåer (C#-referens)

När du anger en typ i en deklaration kontrollerar du om tillgänglighetsnivån för typen är beroende av tillgänglighetsnivån för en medlem eller av en annan typ. Till exempel måste den direkta basklassen vara minst lika tillgänglig som den härledda klassen. Följande deklarationer orsakar ett kompilatorfel eftersom basklassen BaseClass är mindre tillgänglig än MyClass:

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

I följande tabell sammanfattas begränsningarna för deklarerade tillgänglighetsnivåer.

Kontext Kommentarer
Klasser Den direkta basklassen för en klasstyp måste vara minst lika tillgänglig som själva klasstypen.
Gränssnitt De explicita basgränssnitten för en gränssnittstyp måste vara minst lika tillgängliga som själva gränssnittstypen.
Delegater Returtypen och parametertyperna för en ombudstyp måste vara minst lika tillgängliga som själva ombudstypen.
Konstanter Typen av konstant måste vara minst lika tillgänglig som själva konstanten.
Fält Typen av ett fält måste vara minst lika tillgänglig som själva fältet.
Metoder Returtypen och parametertyperna för en metod måste vara minst lika tillgängliga som själva metoden.
Egenskaper Typen av en egenskap måste vara minst lika tillgänglig som själva egenskapen.
Händelser Typen av händelse måste vara minst lika tillgänglig som själva händelsen.
Indexerare Typ- och parametertyperna för en indexerare måste vara minst lika tillgängliga som indexeraren själv.
Operatorer Returtypen och parametertyperna för en operator måste vara minst lika tillgängliga som operatorn själv.
Konstruktörer Parametertyperna för en konstruktor måste vara minst lika tillgängliga som själva konstruktorn.

Exempel

Följande exempel innehåller felaktiga deklarationer av olika typer. Kommentaren efter varje deklaration anger det förväntade kompilatorfelet.

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

Språkspecifikation för C#

Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även