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

可能重复:
为什么Array.Length是int,而不是uint

它背后有一个原因.NET Framework不使用无符号数据类型吗?

我不应该在我的代码中采用它们,但是例如,List 的Count属性是一个int。 你不能有负数,所以为什么不把它定义为uint? 即使我知道计数不能为负,我应该只使用int吗?

无符号数字类型不符合CLS,因此它们不应用于任何 API – 尤其是.NET框架。

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

最基本的答案是.NET框架设计者选择将有符号整数作为BCL(基类库)和CLS(通用语言语法)规范的一部分,而他们并没有选择将无符号整数作为其中的一部分。

由于这个决定背后的原因,最终你不得不问微软。 我想,Eric Lippert可以在这里进行更彻底的解释。

它归结为以下事实:

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

将它们放在一起意味着int类型在大多数情况下都有用。

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

一些.NET感知语言允许使用无符号整数。 例如在C#中你可以使用uint。

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

总而言之……随意使用它们,但使用私有或内部关键字将它们保存在您的课程中。