Top level private classes don't make much sense as they would be invisible to other types. Nested classes are allowed to be private.
Here's an excerpt from C# language spec:
3.5.2 Accessibility domains
The accessibility domain of a top-level unbound type T (§4.4.3) that
is declared in a program P is defined as follows:
- If the declared accessibility of T is public, the accessibility domain of T is the program text of P and any program that references
- P. If the declared accessibility of T is internal, the accessibility domain of T is the program text of P.
From these definitions it follows that the accessibility domain of a
top-level unbound type is always at least the program text of the
program in which that type is declared. The accessibility domain for a
constructed type T is the intersection of the
accessibility domain of the unbound generic type T and the
accessibility domains of the type arguments A1, ...,AN.
The accessibility domain of a nested member M declared in a type T
within a program P is defined as follows (noting that M itself may
possibly be a type):
- If the declared accessibility of M is public, the accessibility domain of M is the accessibility domain of T.
- If the declared accessibility of M is protected internal, let D be the union of the program text of P and the program text of any type
derived from T, which is declared outside P. The accessibility domain
of M is the intersection of the accessibility domain of T with D.
- If the declared accessibility of M is protected, let D be the union of the program text of T and the program text of any type derived from
T. The accessibility domain of M is the intersection of the
accessibility domain of T with D.
- If the declared accessibility of M is internal, the accessibility domain of M is the intersection of the accessibility domain of T with
the program text of P.
- If the declared accessibility of M is private, the accessibility domain of M is the program text of T.