如您所知,MSDN库称string
,decimal
和object
不是原始类型。我正在分享关于此的引用:
基元类型是布尔,字节,SByte,Int16,UInt16,Int32, UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single。
我们也可以通过typeof(typeName).IsPrimitive
属性对其进行测试。另外,我也在stackoverflow.com上阅读了有关string
类型的讨论。
现在我正在读一本名为 CLR的书,通过C#(第四版) ,这本书说(第112页):
如你所见,作家(杰弗里里希特)提到所有这些都是原始类型。
那么,任何人都可以澄清一下,他的意思是什么?为什么这些string
,decimal
,object
和dynamic
类型位于基元列表中?
答案 0 :(得分:7)
我不会亲自致电dynamic
,decimal
,object
或string
原始类型。我在那里使用Type.IsPrimitive
作为规范来源。请注意,dynamic
甚至不是CLR意义上的类型。
C#5 MS规范仅使用单词" primitive"两次 - 一次在介绍中,一次在引号中。即将推出的ECMA C#5标准根本不使用它。鉴于术语"原始" 为CLR类型定义良好,而不是 C#标准化术语的一部分,以这种方式使用它似乎是一个坏主意。 (有些地方C#规范和CLR不同意,例如可用的转换,结构是否具有无参数构造函数等。这有点不同,更尴尬。)
在标准C#术语中,有简单类型 - 但这些类型只是有关键字的值类型。
我无法在C#5 MS规范或ECMA标准中看到任何描述"描述类型"的关键字的任何术语。
答案 1 :(得分:1)
有语言原语Torres,还有CLR原语类型。语言基元类型是编译器本身特殊测试的类型,如字符串和动态。 CLR基元类型是其他类型的核心构建块,如Boolean或Int32。反射函数IsPrimitive仅对CLR基元类型返回true,它不知道您用于编写代码的编程语言,因此它无法了解语言基元类型。了解哪些类型是语言基元类型的唯一方法是阅读语言规范文档。正如所指出的,在C#中,dynamic是一个C#原始类型,因为编译器会对它进行特殊测试(它允许使用特殊的转换规则和动态成员调用)。但是,编译器会在运行时将动态变为Object。 CLR根本没有动态类型。