Declared accessibility

The declared accessibility of a member can be one of the following: Public, which is selected by including a public modifier in the member declaration. The intuitive meaning of public is "access not limited". Protected, which is selected by including a protected modifier in the member declaration. The intuitive meaning of protected is "access limited to the containing class or types derived from the containing class". Internal, which is selected by including an internal modifier in the member declaration. The intuitive meaning of internal is "access limited to this program". Protected internal, which is selected by including both a protected and an internal modifier in the member declaration. The intuitive meaning of protected internal is "access limited to this program or types derived from the containing class". Private, which is selected by including a private modifier in the member declaration. The intuitive meaning of private is "access limited to the containing type".
Depending on the context in which a member declaration takes place, only certain types of declared accessibility are permitted. Furthermore, when a member declaration does not include any access modifiers, the context in which the declaration takes place determines the default declared accessibility. Namespaces implicitly have public declared accessibility. No access modifiers are allowed on namespace declarations. Types declared in compilation units or namespaces can have public or internal declared accessibility and default to internal declared accessibility. Class members can have any of the five kinds of declared accessibility and default to private declared accessibility.

[Note: A type declared as a member of a class can have any of the five kinds of declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility. end note])

Struct members can have public, internal, or private declared accessibility and default to private declared accessibility because structs are implicitly sealed. Struct members introduced in a struct (that is, not inherited by that struct) cannot have protected or protected internal declared accessibility.

[Note: A type declared as a member of a struct can have public, internal, or private declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility. end note])

Interface members implicitly have public declared accessibility. No access modifiers are allowed on interface member declarations. Enumeration members implicitly have public declared accessibility. No access modifiers are allowed on enumeration member declarations.