Як відомо, в різних мовах програмування одні і ті ж програмні конструкції виражаються своїм унікальним, специфічним для конкретного мови чином. Наприклад, в C # конкатенація рядків позначається за допомогою знака "плюс" (+), а в VB для цього зазвичай використовується амперсанд (). Навіть в разі висловлення в двох відмінних мовах однієї і тієї ж програмної ідіоми (наприклад, функції, не повертає значення), дуже висока ймовірність того, що на вигляд синтаксис буде виглядати дуже по-різному.
Як вже показувалося, подібні невеликі варіації в синтаксисі для виконуючого середовища .NET є несуттєвими завдяки тому, що відповідні компілятори (в даному випадку - csc.exe і vbc.exe) генерують схожий набір CIL-інструкцій. Однак мови можуть ще відрізнятися і за загальним рівнем функціональних можливостей. Наприклад, в одному з мов .NET може бути чи не бути ключового слова для представлення даних без знака, а також підтримуватися або не підтримувати типи вказівників. Через усі таких ось можливих варіацій було б просто чудово мати в розпорядженні якісь опорні вимоги, яким повинні були б відповідати всі підтримують .NET мови.
CLS (Common Language Specification - загальна специфікація для мов програмування) як раз і являє собою набір правил, які у всіх подробицях описують мінімальний і повний комплект функціональних можливостей, які має обов'язково підтримувати кожен окремо взятий .NET-компілятор для того, щоб генерувати такий програмний код, який міг би обслуговуватися CLR і до якого в той же час могли б однаковим чином отримувати доступ всі мови, орієнтовані на платформу .NET. Багато в чому CLS може вважатися просто підмножиною всіх функціональних можливостей, визначених у CTS.
В кінцевому підсумку CLS є свого роду набором правил, яких повинні дотримуватися творці компіляторів при бажанні, щоб їх продукти могли без проблем функціонувати в світі .NET. Кожне з цих правил має просту назву (наприклад, "Правило CLS номер 6") і описує, яким чином його дію стосується тих, хто створює компілятори, і тих, хто (будь-яким чином) буде взаємодіяти з ними. Найголовнішим в CLS є правило 1. свідчить, що правила CLS стосуються тільки тих частин типу, які робляться доступними за межами збірки, в якій вони визначені.
З цього правила можна (і потрібно) зробити висновок про те, що всі інші правила в CLS не поширюються на логіку, яка застосовується для побудови внутрішніх робочих деталей типу .NET. Єдиними аспектами типу, які повинні відповідати CLS, є самі визначення членів (тобто угоди про іменування, параметри і повертаються типи). В рамках логіки реалізації члена може застосовуватися будь-яку кількість і не узгоджених з CLS прийомів, оскільки для зовнішнього світу це не буде грати ніякої ролі.
Цей приклад ілюструє, що CLS працює двома способами:
Індивідуальні компілятори недостатньо потужні, щоб підтримувати всі можливості .NET - це являє складність для розробників компіляторів інших мов програмування, націлених на .NET.
Якщо обмежити класи лише CLS-сумісними засобами, то код, написаний на будь-якому іншому мовою програмування, зможе користуватися цими класами.
Витонченість цієї ідеї полягає в тому, що обмеження в застосуванні CLS-сумісних коштів накладаються тільки на загальнодоступні і захищені члени класів і на загальнодоступні класи. В межах приватної реалізації класів ви вільні писати будь несумісний з CLS код, оскільки код з інших збірок (одиниць керованого коду) в будь-якому випадку не має доступу до цієї частини коду.