.NET原语和类型层次结构,为什么它是这样设计的?

Max*_*oro 6 .net c# primitive

我想了解为什么在.NET上有九个整数类型:Char,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,和UInt64; 再加上其他的数字类型:Single,Double,Decimal,并且所有这些类型都没有任何关系.

当我第一次开始使用C#进行编码时,我认为"很酷,有一种uint类型,我会在不允许使用负值时使用它".然后我意识到不使用API uintint代替,而uint不是衍生自int,所以需要的转化率.

这些类型的真实应用是什么?为什么不相反,integer而且positiveInteger?这些是我能理解的类型.一个人的年龄是一个positiveInteger,并且因为是预期的转换需要positiveInteger的子集.integerinteger

以下是XPath 2.0和XQuery 1.0中的类型层次结构图.如果你看看下面xs:anyAtomicType,你可以看到数字层次decimal> integer> long> int> short> byte.为什么.NET不是这样设计的?新框架"奥斯陆"会有所不同吗?

替代文字

RAO*_*AOF 4

我的猜测是因为底层硬件破坏了该类层次结构。很多时候(也许令人惊讶)您关心 aUInt32是一个 4 字节大且无符号的,因此 aUInt32 不是的一种Int32,也不是 的Int32a 类型 Int64

而且您几乎总是关心 anint和 a之间的区别float

从根本上讲,继承和类层次结构与数学集合包含不同。UInt32a可以保存的值是 an 可以保存的值的严格子集这一事实Int64并不意味着 aUInt32是 的类型Int64。不太明显的是, anInt32不是一种类型Int64- 尽管它们之间没有概念上的差异,但它们的底层表示不同(4 字节与 8 字节)。 Decimals更是不同。

XPath 是不同的:所有数字类型的表示形式基本上是相同的 - ASCII 数字字符串。short在那里, a和 a之间的区别long可能的范围之一,而不是表示形式 - “123”既是 a 的有效表示形式,又是具有相同值short的 a 的有效表示形式。long