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.