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

时间:2010-07-15 20:56:29

标签: c# .net casting language-design unsigned

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

class Element{
  public uint Size;
  public ulong BigThing;
}

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

int x=MyElement.Size;

一样
int x=5;
uint total=MyElement.Size+x;

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

5 个答案:

答案 0 :(得分:18)

  

为什么语言设计者决定不使用有符号和无符号整数类型   隐含地施法?

因为这可能会丢失数据或抛出任何异常,所以这两者通常都不是隐含允许的好事。 (从长到双的隐式转换也可能会丢失数据,不可否认,但是以不同的方式。)

  

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

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

答案 1 :(得分:4)

与Jon的回答一样,仅仅因为无符号数不能为负数并不意味着它不比有符号数大。 uint为0到4,294,967,295,但int为-2,147,483,648到2,147,483,647。损失最多int以上的空间。

答案 2 :(得分:1)

因为隐式地将无符号整数3B转换为有符号整数将会爆炸。

无符号的最大值是签名的两倍。这也是你不能把长期转换为int的原因。

答案 3 :(得分:1)

  

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

 int x=MyElement.Size;

但你在这里自相矛盾。如果你真的(真的)需要将Size指定为无符号而不是将其指定给(带符号)x则是错误。代码中的一个深层缺陷。

  

例如String.Length永远不会是负数,但它是有符号整数

但是String.IndexOf可以返回一个负数,如果String.Length和Index值不同的类型,它会很尴尬。

虽然理论上有一个无符号String.Length(4 GB上限)的优点,但实际上即使当前的2GB也足够大(因为这个长度的字符串很少见且不可行)。

所以真正的答案是:为什么首先使用无符号?

答案 4 :(得分:0)

关于第二个计数:因为他们希望CLR与没有无符号数据类型的语言兼容(读取:VB.NET)。