Я считаю, что их основной причиной была мобильность программ, ориентированных на CLR.Если бы они допускали, чтобы базовый тип, такой как int
, зависел от платформы, создание переносимых программ для CLR стало бы намного сложнее.Распространение целочисленных типов typedef
в независимом от платформы коде C / C ++ для использования встроенного int
является косвенным указанием на то, почему разработчики CLR решили сделать встроенные типы независимыми от платформы.Подобные несоответствия являются серьезным препятствием для достижения цели: «пиши один раз, беги куда угодно» систем исполнения на основе виртуальных машин.
Edit Чаще всего размер int
воспроизведенияв ваш код неявно через битовые операции, а не через арифметику (в конце концов, что может пойти не так с i++
, верно?) Но ошибки, как правило, более тонкие.Рассмотрим пример ниже:
const int MaxItem = 20;
var item = new MyItem[MaxItem];
for (int mask = 1 ; mask != (1<<MaxItem) ; mask++) {
var combination = new HashSet<MyItem>();
for (int i = 0 ; i != MaxItem ; i++) {
if ((mask & (1<<i)) != 0) {
combination.Add(item[i]);
}
}
ProcessCombination(combination);
}
Этот код вычисляет и обрабатывает все комбинации из 20 элементов.Как вы можете сказать, код с треском проваливается в системе с 16-битным int
, но отлично работает с 32-битными или 64-битными.
Небезопасный код может стать источником головной боли: когда int
исправлен в коде некоторого размера (скажем, 32), который выделяет в 4 раза больше байтов, сколько будет работать нужное ему число, даже если технически некорректно использовать 4 вместо sizeof(int)
.Более того, этот технически некорректный код останется переносимым!
В конечном счете, такие мелкие вещи сильно влияют на восприятие платформы как «хорошее» или «плохое».Пользователи программ .NET не заботятся о том, что программа аварийно завершает работу, потому что ее программист допустил непереносимую ошибку или CLR содержит ошибки.Это похоже на то, как ранние версии Windows воспринимались как нестабильные из-за низкого качества драйверов.Для большинства пользователей сбой - это просто очередной сбой программы .NET, а не проблема программистов.Следовательно, для восприятия «экосистемы .NET» полезно сделать стандарт как можно более щадящим.