The primary design challenge in creating a common language specification is choosing the right size subset – large enough that it is properly expressive and small enough that all languages can reasonably accommodate it.
Because the CLS is about language interoperability, its rules apply only to “externally visible” items. The CLS assumes that language interoperability is important only across the assembly boundary – that is, within a single assembly there are no restrictions as to the programming techniques that are used. Thus, the CLS rules apply only to items that are visible (see Visibility of Types) outside of their defining assembly and have public, family, or family-or-assembly accessibility (see Accessibility of Members).
It is useful to define some terminology:
While many things contribute to the decision to exclude a VOS concept from the CLS, one should be explicitly called out: any construct that would make it impossible to rapidly verify code is excluded from the CLS. This allows all CLS-compliant languages to produce verifiable code if they so choose.