“原始类型”与“内置值类型”

我最近在使用Array.SetValue(Int32)方法时在C#中遇到了exception。 例外是:

无法从源类型扩展到目标类型,因为源类型不是基本类型或无法完成转换。

对“原始”这个词的引用让我感到有些惊讶,因为我认为倾向于将这些类型称为内置类型,而“原始类型”一词也是一个非正式术语。 “原始”类型和“内置值类型”之间有什么区别? 我没有在C#语言规范中找到原始类型的定义。

原始类型未在C#语言规范中定义。 它们在.NET本身中定义,对于基本类型的最佳参考是直接在MSDN上查看Type.IsPrimitive 。 具体来说,“备注”部分列出了可用的基元类型。

这里我们有一个完整的参考,这些是CLI规范中定义的原始类型(第I.8.2.2节):

  • Boolean
  • Byte
  • SByte
  • Int16
  • UInt16
  • Int32
  • UInt32
  • Int64
  • UInt64
  • IntPtr
  • UIntPtr
  • Char
  • Double
  • Single

与流行的看法相反,仅仅因为类型具有相应的关键字并不使其成为原始类型,最好的例子可能是string

另一方面,值类型也可以是原语,也可以不是原语。 除了CLI规范中定义的值之外,.NET Framework还有许多“内置”的值类型,但它们不归类为原语。 一个很好的例子是DateTime ,它是.NET Framework提供的一个struct ,根据该定义,它可以被认为是“内置值类型”。 您可以在此处阅读有关值类型的更多信息(当然也将涵盖内置类型)。