Всем привет! Дайте, пожалуйста, определения следующим понятиям: Простые типы (simple types) Примитивные типы (primitive types) Встроенные типы (built-in types) И какие именно типы к этим группам относят.
Почему меня это заинтересовало - читая книгу Рихтера "CLR via C#", а именно Главу 5, вижу таблицу примитивных типов, в которой написаны: Числовые типы (byte..double и decimal) bool string object dynamic. Но, далее Рихтер уже пишет, что decimal не является примитивным. Получается противоречие. Полез я тогда в библиотеку MSDN и нашел следующее: К простым типам относятся: Числовые типы и bool К встроенным типам относят: Числовые типы bool string object. К примитивным типам относят: Все числовые типы (кроме decimal) bool IntPtr UIntPtr. Ссылки: 1 и 2 пункт 3 пункт. Получается, что Рихтер в таблице хотел показать встроенные типы, но почему-то написал их как примитивные. Или я чего-то не понимаю? Искал в других источниках: там простые/примитивные/встроенные типы - это синонимы.
Ответ Канонический источник информации — официальная спецификация языка. В ней сказано (раздел 4.1 Value types): C# provides a set of predefined struct types called the simple types. simple-type: numeric-type bool numeric-type: integral-type floating-point-type decimal
То есть, decimal и bool является, а string, object и dynamic не является simple-type. Тот же список приведён в явном виде в разделе 4.1.4: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, bool, decimal. Слово “primitive” употребляется в спецификации всего дважды: в части 1 (Introduction): C# has a unified type system. All C# types, including primitive types such as int and double, inherit from a single root object type. и в части 11 (Structs): Just as these predefined types are structs, it is also possible to use structs and operator overloading to implement new “primitive” types in the C# language. Нигде нету более точного определения, поэтому можно считать, что понятие primitive type не формализовано. То же относится и к built-in: данный термин вовсе не встречается в спецификации. Рихтер, судя по всему, позволяет себе несколько вольное обращение с терминами (он настолько крут, что может себе это позволить).