Einschränkungen bei der Verwendung von Zugriffsebenen (C#-Referenz)
Wenn Sie einen Typ in einer Deklaration angeben, überprüfen Sie, ob die Zugriffsebene des Typs von der Zugriffsebene eines Members oder eines anderen Typs abhängig ist. So muss die direkte Basisklasse mindestens so zugreifbar sein wie die abgeleitete Klasse. Die folgenden Deklarationen verursachen einen Compilerfehler, da die BaseClass-Basisklasse weniger zugreifbar ist als MyClass:
class BaseClass {...}
public class MyClass: BaseClass {...} // Error
Die nachstehende Tabelle fasst die Einschränkungen für deklarierte Zugriffsebenen zusammen.
Kontext |
Hinweise |
---|---|
Die direkte Basisklasse eines Klassentyps muss mindestens so zugreifbar sein wie der Klassentyp selbst. |
|
Die expliziten Basisschnittstellen eines Schnittstellentyps müssen mindestens so zugreifbar sein wie der Schnittstellentyp selbst. |
|
Der Rückgabetyp und die Parametertypen eines Delegattyps müssen mindestens so zugreifbar sein wie der Delegattyp selbst. |
|
Der Typ einer Konstante muss mindestens so zugreifbar sein wie die Konstante selbst. |
|
Der Typ eines Felds muss mindestens so zugreifbar sein wie das Feld selbst. |
|
Der Rückgabetyp und die Parametertypen einer Methode müssen mindestens so zugreifbar sein wie die Methode selbst. |
|
Der Typ einer Eigenschaft muss mindestens so zugreifbar sein wie die Eigenschaft selbst. |
|
Der Typ eines Ereignisses muss mindestens so zugreifbar sein wie das Ereignis selbst. |
|
Der Typ und die Parametertypen eines Indexers müssen mindestens so zugreifbar sein wie der Indexer selbst. |
|
Der Rückgabetyp und die Parametertypen eines Operators müssen mindestens so zugreifbar sein wie der Operator selbst. |
|
Die Parametertypen eines Konstruktors müssen mindestens so zugreifbar sein wie der Konstruktor selbst. |
Beispiel
Im folgenden Beispiel sind falsche Deklarationen verschiedener Typen enthalten. Der einer Deklaration nachfolgende Kommentar zeigt den erwarteten Compilerfehler an.
// 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#-Programmiersprachenspezifikation
Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.
Siehe auch
Referenz
Zugriffsmodifizierer (C#-Referenz)
Zugriffsmodifizierer (C#-Programmierhandbuch)