The “protected internal” access modifier is a union of both the “protected” and “internal” modifiers.
From MSDN, Access Modifiers (C# Programming Guide):
protected:
The type or member can be accessed only by code in the same class or
struct, or in a class that is derived from that class.
internal:
The type or member can be accessed by any code in the same assembly,
but not from another assembly.
protected internal:
The type or member can be accessed by any code in the assembly in
which it is declared, OR from within a derived class in another
assembly. Access from another assembly must take place within a class
declaration that derives from the class in which the protected
internal element is declared, and it must take place through an
instance of the derived class type.
Note that: protected internal
means “protected
OR internal
” (any class in the same assembly, or any derived class – even if it is in a different assembly).
…and for completeness:
private:
The type or member can be accessed only by code in the same class or
struct.
public:
The type or member can be accessed by any other code in the same
assembly or another assembly that references it.
private protected:
Access is limited to the containing class or types derived from the
containing class within the current assembly.
(Available since C# 7.2)