Подтвердить что ты не робот

"Примитивные типы" по сравнению с "встроенными типами значений"

Недавно я обнаружил исключение в С# при использовании метода Array.SetValue(Int32). Исключением было:

Невозможно расширить из типа источника в целевой тип либо потому, что источник тип не является примитивным типом или преобразование не может быть выполняется.

Ссылка на слово "примитив" меня немного удивила, потому что я думал, что тенденция относиться к этим типам как к встроенным типам, также что термин "примитивный тип" был неофициальным термином. В чем разница между "примитивными" типами и "встроенными типами значений"? Я не нашел определения примитивных типов в спецификации языка С#.

4b9b3361

Ответ 1

Примитивные типы не определены в Спецификации языка С#. Вместо этого они определены в самой .NET, и лучшая ссылка для примитивных типов - это смотреть на Type.IsPrimitive на MSDN. В частности, в разделе "Примечания" перечислены доступные примитивные типы.

Итак, у нас есть полная ссылка здесь, это примитивные типы, определенные в Спецификации CLI (раздел I.8.2.2):

Вопреки распространенному мнению, только потому, что тип имеет соответствующее ключевое слово, не делает его примитивным типом, лучшим примером может быть string.

С другой стороны, типы значений могут быть и не быть примитивами. Существует множество типов значений "встроенный" для .NET Framework в дополнение к тем, которые определены в спецификации CLI, но они не классифицируются как примитивы. Хорошим примером является DateTime, который представляет собой struct, предоставленный .NET Framework, по этому определению его можно считать "встроенным типом значения", Вы можете больше узнать о типах значений (которые, конечно же, будут охватывать и встроенные) здесь.