为什么unsigned int不符合CLS?


Answers:


88

并非所有语言都具有无符号整数的概念。例如,VB 6没有unsigned int的概念,我怀疑这促使VB7 / 7.1的设计人员决定也不要实施(现在已在VB8中实施)。

报价:

http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx

CLS的设计足够大,可以包含开发人员通常需要的语言结构,但又要足够小,以使大多数语言都能够支持它。此外,CLS排除了任何无法快速验证代码类型安全的语言构造,因此,所有符合CLS的语言都可以选择生成可验证的代码。

更新:几年前,我确实对此感到疑惑,尽管我看不到为什么UInt不能进行类型安全性验证,但我想CLS专家必须在某个基准点上设置一个临界点支持的值类型数。同样,当您考虑将越来越多的语言移植到CLR的长期目标时,如果绝对没有概念,为什么要强迫它们实现无符号int以获得CLS遵从性呢?


@Kevin:我只是想知道这个话题。您的回答似乎合乎逻辑。我只想考虑这个话题。我认为这很遗憾,类似于Pascal的类型没有进入CLR。但是您对其他语言的争论:这是否阻止IronPython在静态静态类型的CLR中使用强动态类型(DLR)?
doekman

@doekman:是的,IronPython和IronRuby证明了CLR可以提供一个平台,您可以在该平台上构建动态类型的语言,而CLS的目标是提供一套超越语言功能并允许它们成功且安全地互操作的标准。我不认为某种语言在添加DL功能方面能做什么与CLS / CTS中应包含的内容直接相关。
凯夫(Kev)

根据我的理解,CLR有一个32位整数基元类型,它具有单独的指令,用于带符号的加法检查,带符号的不可知加法2 ^ 32等。当要求将对象引用转换为32位整数基元时,CLR既不知道也不在乎使用该数字的代码是否期望它是有符号的或无符号的。编译器相信数字是带符号的还是无符号的,通常会影响编译器生成的用于对其进行操作的指令,但这是一种语言(不是CLR)。
超级猫

23

我怀疑,部分问题与以下事实有关:C语言中的无符号整数类型必须表现为抽象代数环的成员而不是数字[例如,如果无符号16位整数变量等于0, ,递减则需要产生65,535,如果等于65,535,则需要递增使其产生零。]有时这种行为非常有用,但是数字类型表现出的这种行为可能与某些语言的精神背道而驰。我猜想,省略无符号类型的决定可能早于决定同时支持选中和未选中数字上下文的决定。我个人希望无符号数和代数环有单独的整数类型。将一元负运算符应用于无符号32位数字应产生64位有符号结果(除零以外的任何值将产生负数),但对环类型应用一元负则应产生该环内的加法逆。

无论如何,无符号整数不符合CLS的原因是Microsoft决定语言不必为了支持“ CLS兼容”就必须支持无符号整数。


从数学的角度讲极好的解释!
2015年

6

在现实生活中,无符号int不会给您带来太多好处,但是拥有不止一种int类型会给您带来痛苦,因此许多语言只使用int。

符合CLS的目的是允许使用多种语言的课程…

请记住,没有人能使您符合CLS。

您仍然可以方法使用无符号整数,也可以将其用作私有方法的参数,因为它仅是CLS兼容限制的公共API。


16
如果您要进行按位算术运算,则它们非常重要。
nicodemus13 2012年

@ nicodemus13什么时候是您最后一次看到在问题域中具有按位算术功能的业务管理系统?(例如VB.NET程序员编写的那种软件)
伊恩·林格罗斯

38
带有校验和的任何东西都将使用按位算术,这是很常见的,并且我拖拽其他所有语言似乎很奇怪,因为VB不支持无符号整数。.NET也应具有通用性,而不仅仅是LOB应用程序的VB编写者。当您说“ 1类型的整数”时,您不认为拥有字节,短整数,整数,长整数也很痛苦吗?我不太明白为什么签名会更尴尬。
nicodemus13 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.