Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
When you specify a type in a declaration, check whether the accessibility level of the type is dependent on the accessibility level of a member or of another type. For example, the direct base class must be at least as accessible as the derived class. The following declarations cause a compiler error because the base class BaseClass is less accessible than MyClass:
class BaseClass {...}
public class MyClass: BaseClass {...} // Error
The following table summarizes the restrictions on declared accessibility levels.
| Context | Remarks | 
|---|---|
| Classes | The direct base class of a class type must be at least as accessible as the class type itself. | 
| Interfaces | The explicit base interfaces of an interface type must be at least as accessible as the interface type itself. | 
| Delegates | The return type and parameter types of a delegate type must be at least as accessible as the delegate type itself. | 
| Constants | The type of a constant must be at least as accessible as the constant itself. | 
| Fields | The type of a field must be at least as accessible as the field itself. | 
| Methods | The return type and parameter types of a method must be at least as accessible as the method itself. | 
| Properties | The type of a property must be at least as accessible as the property itself. | 
| Events | The type of an event must be at least as accessible as the event itself. | 
| Indexers | The type and parameter types of an indexer must be at least as accessible as the indexer itself. | 
| Operators | The return type and parameter types of an operator must be at least as accessible as the operator itself. | 
| Constructors | The parameter types of a constructor must be at least as accessible as the constructor itself. | 
Example
The following example contains erroneous declarations of different types. The comment following each declaration indicates the expected compiler 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# language specification
For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.