Система типов C# полностью отражает систему типов .NET и в целом достаточно типична для современных языков. Важная особенность этой системы типов заключается в явном разделении всех типов на типы-значения и ссылочные типы (мы уже обсуждали эти пониятия в лекции 1 ).
К типам-значениям относится широкий набор примитивных типов данных, включая целые числа различной разрядности, типы с плавающей запятой различной точности, специальный тип decimal с фиксированной точностью, предназначенный для финансовых вычислений, а также символьный тип char , способный хранить символы в формате Unicode и потому удобный при разработке интернациональных приложений. Все целочисленные типы существуют в двух вариантах: знаковом и беззнаковом. Важной особенностью переменных с плавающей запятой является то, что операции над ними никогда не производят исключений, но зато результатом работы с ними могут быть значения (как результат деления на ноль) или нечисловым значением, NaN (Not-A-Number, как результат деления 0 на 0 или операций, в котором один из операндов уже равняется NaN ).
Отметим, что C# содержит также специальный тип для булевских значений; переменные булевского типа могут содержать значения true или false , но в отличие от большинства современных языков программирования этим значениям не соответствует никаких численных эквивалентов (в отличие, скажем, от VB, где False соответствует 0, а True почему-то соответствует значение -1).
Помимо примитивных типов, в С# существует возможность организовывать данные в структуры, состоящие из переменных любого типа, или в перечисления, составленные из нескольких переменных одного и того же целочисленного типа. Важной особенностью перечислений в С# является необходимость явного приведения к базовому типу при желании проинтерпретировать значение из перечисления как число.