В большинстве объектно-ориентированных языков есть две отдельных категории типов:
базисные
(primitive types), т. е. присущие языку, и
классы —
типы, которые может создать пользователь языка. Как вы уже могли догадаться, к базисным относятся обычно такие простые типы, как символы, строки и числа, тогда как классы чаще представляют собой более сложные конструкции.
Существование двух категорий типов ведет к возникновению массы проблем. Одна из них связана с совместимостью. Допустим, вам потребовалась совокупность значений типа
int в
традиционной системе, где имеются оба набора типов. При этом нужно будет создать класс, содержащий исключительно значения типа
int.
А если еще потребуется класс, содержащий совокупность значений типа
double,
вам придется делать то же самое и для данного типа. Причина в том, что эти базисные типы обычно не имеют ничего общего. Они не являются настоящими объектами и поэтому не происходят от общего базового класса — к каждому из них применяются собственные правила. Аналогичная проблема обнаруживается при попытке в таких традиционных системах задать метод, принимающий аргумент
любого
типа, поддерживаемого языком. Поскольку базисные типы несовместимы, невозможно задать использование подобного аргумента, если не написать для каждого базисного типа класс-оболочку.
К счастью, в мире .NET и С# такой проблемы уже нет, поскольку в CTS любая сущность — объект. Более того, все объекты косвенно происходят от единого базового класса, определенного в составе CTS. Этот базовый класс —
System.Object —
будет описан в разделе «Упаковка и распаковка».