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的语言中.(您仍然可以使用它们,但它们不是语言本身的一部分 - 例如,您无法使用常规算术运算符.)
根据乔恩的回答,仅仅因为无符号数不能为负数并不意味着它不比有符号数大。uint为 0 到 4,294,967,295,但int为 -2,147,483,648 到 2,147,483,647。int超出最大损失的空间很大。