Although it is generally believed that good practice is explicit in all access modifiers, it is not unreasonable to allow them to be omitted with some default.
Of course, this default should be reasonable. If the default value was publicly available and used improperly, there would be no way to statically determine that it was an error (unless it disclosed a type that was defined elsewhere with less access), the code could go for several months or years before someone noticed an error, and then fixing it would be a violation of changes to the assembly.
Since the default value is private, where applicable, and internal in all other cases, if it is an error, this will lead to a compiler error (as something requires it to have more access), which was caught easily or in the class just not visible to other builds (easily caught, especially with most IDEs).
Limiting defaults is the obvious way.
source share