关于字符串的不同意见是一种原始类型

时间:2017-12-01 08:50:11

标签: c# .net string types primitive-types

如您所知,MSDN库称stringdecimalobject不是原始类型。我正在分享关于此的引用:

  

基元类型是布尔,字节,SByte,Int16,UInt16,Int32,   UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single。

我们也可以通过typeof(typeName).IsPrimitive属性对其进行测试。另外,我也在stackoverflow.com上阅读了有关string类型的讨论。

现在我正在读一本名为 CLR的书,通过C#(第四版) ,这本书说(第112页):

CLR via C#, Fourth Edition (Jeffrey Richter)

如你所见,作家(杰弗里里希特)提到所有这些都是原始类型。 那么,任何人都可以澄清一下,他的意思是什么?为什么这些stringdecimalobjectdynamic类型位于基元列表中?

2 个答案:

答案 0 :(得分:7)

我不会亲自致电dynamicdecimalobjectstring原始类型。我在那里使用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根本没有动态类型。