C# 为什么.NET Framework不使用无符号数据类型?

C# 为什么.NET Framework不使用无符号数据类型?,c#,.net,.net-3.5,.net-4.0,C#,.net,.net 3.5,.net 4.0,可能重复: NET Framework不使用无符号数据类型背后有什么原因吗 我不应该在代码中采用它们,但例如,列表的Count属性是int。不能有负数,那么为什么不应该将其定义为uint呢?即使我知道计数不能为负,我是否应该只使用int?无符号数字类型不是,因此它们不应用于任何API,尤其是.NET framework 基本上,符合CLS的代码只使用所有.NET语言中可用的类型。某些语言(如VB.NET)不支持无符号数字类型。无符号数字不符合CLS,因为有些语言不支持这些类型。我在更正中发言,

可能重复:

NET Framework不使用无符号数据类型背后有什么原因吗


我不应该在代码中采用它们,但例如,列表的Count属性是int。不能有负数,那么为什么不应该将其定义为uint呢?即使我知道计数不能为负,我是否应该只使用int?

无符号数字类型不是,因此它们不应用于任何API,尤其是.NET framework


基本上,符合CLS的代码只使用所有.NET语言中可用的类型。某些语言(如VB.NET)不支持无符号数字类型。

无符号数字不符合CLS,因为有些语言不支持这些类型。我在更正中发言,但VB.NET不支持无符号类型。这意味着,如果将公共成员声明为无符号类型,则不能从VB.NET或任何其他不支持无符号类型的.NET语言中使用程序集。

最基本的答案是.NET framework设计器选择将有符号整数作为BCL(基类库)和CLS(公共语言语法)的一部分规范,而他们没有选择使无符号整数成为其中的一部分

对于这个决定背后的原因,最终你必须问微软。我想埃里克·利珀特可以在这里插话,给出更彻底的解释

归根结底是以下事实:

  • 您不能(或至少不能)在
    int
    uint
    之间进行隐式转换,这意味着必须使用强制转换语法显式进行转换
  • 如果不增加代码的可读性,最好避免不必要的强制转换语法
  • int
    的上界对于我们在代码中处理的大多数数字是足够的

把它们放在一起意味着在大多数情况下,
int
类型可以达到这个目的。

一些支持.NET的语言确实允许使用未签名的int。例如,在C#中,您可以使用uint

但是,由于它们不符合CLS,如果您在程序集外部公开它们,那么您可能会发现其他使用不同语言的开发人员在使用您的类时会遇到问题


总之。。。您可以随意使用它们,但请使用私有关键字或内部关键字将它们压缩到您的类中。

复制和…我保证我先做了家庭作业并进行了搜索。可能是错误的关键字组合。虽然我仍然不认为它回答了为什么一个无符号int不符合CLS的问题。回答这个问题并不能真正回答“为什么”的问题,是吗?@nikie it。它只是产生了一个新的问题:为什么它们不符合CLS。@nikie-@esac:ULong/UInteger是与.NET 2.0VB一起添加的。NET不支持未签名类型;我不确定哪些语言不需要。实际上,当您需要在试图成为CLSCompliant的语言中使用unsigned时,会出现更多的强制转换,例如C#。当我们知道我们在使用包含位和字节的缓冲区时,效率非常低,并且必须从int连续转换ushort,例如,将两个ushort相加总是作为整数计算。我想知道的是,哪些较小的语言不支持大多数人想要做的事情,即无符号/压缩值。我想我们都同意只因情况不同而重复的名字是可以接受的。较小的语言应该进行更多的铸造,而不是普通语言。