为什么无符号CLR类型在C#中如此难以使用?

Ear*_*rlz 9 .net c# unsigned casting language-design

在开始使用C#之前,我来自大多数C/C++背景.我在C#中第一个项目所做的一件事就是创建一个这样的类

class Element{
  public uint Size;
  public ulong BigThing;
}
Run Code Online (Sandbox Code Playgroud)

然后我被这个需要铸造的事实所羞辱:

int x=MyElement.Size;
Run Code Online (Sandbox Code Playgroud)

同样如此

int x=5;
uint total=MyElement.Size+x;
Run Code Online (Sandbox Code Playgroud)

为什么语言设计者决定使有符号和无符号整数类型不能隐式转换?为什么整个.Net库中未使用的无符号类型更多?例如String.Length,永远不会是负数,但它是有符号整数.

Jon*_*eet 18

为什么语言设计者决定使有符号和无符号整数类型不能隐式转换?

因为这可能会丢失数据或抛出任何异常,所以这两者通常都不是隐含的好事.(无论如何,从long到double的隐式转换也会丢失数据,但是以不同的方式.)

为什么在整个.Net库中未使用的是无符号类型

无符号类型不符合CLS - 并非所有.NET语言都支持它们.例如,Visual Basic对.NET 1.0和1.1中的无符号数据类型没有"本机"支持; 它被添加到2.0的语言中.(您仍然可以使用它们,但它们不是语言本身的一部分 - 例如,您无法使用常规算术运算符.)

  • "虽然我可能错了" - 你的意思是.NET可能是错的? (3认同)

Jes*_*ess 5

根据乔恩的回答,仅仅因为无符号数不能为负数并不意味着它不比有符号数大。uint为 0 到 4,294,967,295,但int为 -2,147,483,648 到 2,147,483,647。int超出最大损失的空间很大。