Остальные ответы верны. Позвольте мне уточнить некоторые вещи - CLS расшифровывается как Common Language Specification. Это минимальный набор правил и требуемых языковых функций, которые должен реализовывать и понимать язык .NET. Этот набор является подмножеством системы общих типов , которая определяет, как типы определяются в .NET.
Быть совместимым с CLS означает, что вы можете писать код, который может использоваться любым языком, который можно скомпилировать и запустить на CLR. Но соответствие CLS не требуется, что дает вам гибкость в тех случаях, когда соблюдение CLS будет трудно или невозможно сделать.
Если вы хотите, чтобы ваш код использовался другими разработчиками, ваш API (ваши общедоступные классы и методы) должны быть совместимы с CLS. Вы должны заявить об этом, добавив CLSCompliantAttribute в свои сборки. Если вы не пишете для других, соответствие CLS не требуется, хотя FxCop ( Framework Cop) не согласится со мной.
Когда ваша сборка помечена атрибутом CLSCompliantAttribute, компилятор (должен!) Проверит ваш код, чтобы определить, нарушит ли он при компиляции какое-либо из правил CLS (некоторые из которых ocdecio упомянуты) и сообщать вам о нарушениях для исправления.