UInt32
,UInt64
或uint
真的是long
吗?我认为unsigned int
和int
之间的唯一区别是unsigned
整数没有标记为允许负数,而且它们只能包含正数,对吗?
如果是这样,那么为什么Visual Studio会告诉我:
this.SomeProperty = this.Width - BorderThickness;
无法从long
类型转换为类型int
?
我目前正在使用:
uint BorderThickness;
然而,像往常一样,如果我将其改回:
int BorderThickness;
它会起作用。
为什么unsigned
int
为long
?为什么不把它称为long
?
答案 0 :(得分:9)
你的问题是基于一种误解。
当您添加,减去,乘以等int
和uint
时,C#会自动将两者都提升为long
,因此结果为long
。< / p>
C#定义运算符
int + int --> int
long + long --> long
uint + uint --> uint
ulong + ulong --> ulong
等等。在给出奇怪的表达式int + uint
时,哪一个是最佳选择?它不能是int + int
,因为uint
可能不合适;一个uint可能是3000000000,这对于int来说太大了。它不能是uint + uint
或ulong + ulong
,因为int可能是负数。最好的选择是long + long
,因此结果很长。
您发现了正确的解决方案:首先不要使用uint
。在C#中使用uint
几乎没有充分的理由。如果您的数量值大于int
中的最大值,请使用long
。 C#中的无符号整数主要用于与支持它们的其他语言的互操作性;使用有符号整数编写业务逻辑。