可能重复:
Why does .NET use int instead of uint in certain classes?
Why is Array.Length an int, and not an uint
我一直想知道为什么.Count
不是无符号整数而不是有符号整数?
例如,取ListView.SelectedItems.Count
。元素的数量不能小于0,那么为什么它是一个signed int?
如果我尝试测试是否选择了元素,我想测试
if (ListView.SelectedItems.Count == 0) {}
但因为它是有符号整数,我必须测试
if (ListView.SelectedItems.Count <= 0) {}
或者.Count
是否可以&lt; 0?
答案 0 :(得分:53)
无符号整数不符合CLS(Common Language Specification)
有关符合CLS的代码的详细信息,请参阅以下链接:
答案 1 :(得分:6)
Mabye因为uint数据类型不是CLS(通用语言规范)的一部分,因为并非所有.Net语言都支持它。
这是关于数组的非常类似的线程:
答案 2 :(得分:5)
让我们从实际角度来看这个。
无论好坏,签名int
是.NET中使用的正常类int
。在C和C ++中使用带符号的int
也是正常的。因此,除非有充分的理由,否则大多数变量都被声明为int
而不是无符号int
。
在未签名的int
和签名的int
之间进行转换存在问题,但并不总是安全的。
在32位系统上,集合不可能有近2 ^^ 32个项目,所以签名int
在所有情况下都足够大。
在64位系统上,无符号int
对您没有多大帮助,在大多数情况下,签名int
仍然足够大,否则您需要使用64位int
。 (我希望64系统上没有任何一个标准集合能够很好地应对2 ^^ 31个项目!)
因此,如果使用未签名的int
没有明显的优势,为什么要使用未签名的int
?
答案 3 :(得分:3)
它不符合CLS,主要是为了提供更多不同语言的支持。
signed int可以轻松地从使用指针算法的C或C ++移植代码。
Count可以是表达式的一部分,其中整体值可以为负数。特别地,count与索引具有直接关系,其中有效索引总是在[0,Count-1]的范围内,但是使用例如否定结果。通过一些二进制搜索方法(包括BCL提供的方法)来反映应该插入新项目的位置以维持秩序。
答案 4 :(得分:0)
在vb.net中,正常的循环结构(“For / Next循环”)将执行循环,其值最大并包括指定的最大值,这与C可以轻松循环,其值低于上限。因此,通常需要指定一个循环,例如, “For I = 0 To Array.Length-1”;如果Array.Length是无符号的并且为零,则可能导致明显的问题。即使在C语言中,也可以说“for(i = Array.Length-1; i GE 0; - i)”。有时我认为拥有一个31位整数类型会很有用,它可以支持扩展转换为signed和unsigned int,但我从来没有听说过支持这种语言的语言。