我通常用C ++编程,但是对于学校我必须用C#做一个项目。
所以我继续进行编码,就像我习惯使用C ++一样,但是当编译器抱怨代码如下时,我感到很惊讶:
const uint size = 10;
ArrayList myarray = new ArrayList(size); //Arg 1: cannot convert from 'uint' to 'int
好的,他们期望int作为参数类型,但为什么呢?对于uint作为参数类型,我会感觉更舒服,因为uint在这种情况下更适合。
为什么他们在.NET库中几乎无处不在地使用int作为参数类型,即使在很多情况下负数也没有任何意义(因为没有容器或gui元素可以具有负大小)。
如果他们使用int的原因是,他们并不期望普通用户关心签名,为什么他们没有为addint添加超载?
这只是MS不关心标志的正确性,还是有负值有意义/携带容器/ gui widget / ...尺寸的错误代码????)?
答案 0 :(得分:12)
我认为Microsoft选择Int32
因为UInt32
不符合CLS(换句话说,并非所有使用.NET框架的语言都支持无符号整数)。
答案 1 :(得分:2)
因为无符号整数不是CLS compliant。有些语言缺少对它们的支持,Java就是一个例子。
答案 2 :(得分:2)
除了讨论CLS合规性的答案之外,考虑整数数学(例如10 + 2)导致整数(如签名)数据,这只是有意义的;现在考虑将每个数学表达式转换为uint
以将其传递给您引用的方法之一的麻烦。
对于采用uint
的重载 - 在许多情况下,方法参数存储为(或用于计算)属性值,通常为int
类型(同样适用于CLS,并且可能为整数数学方便);标志的差异会令人困惑,更不用说容易溢出了。
答案 3 :(得分:0)
Stroustrup在 C ++编程语言中更喜欢int over“uint”,我认为他的理由也适用于C#:
这是关于下溢而没有警告:
// Unintended very large uint
uint oops = (uint)5 - (uint)10;
或:
// Unintended infinite loop
for( uint counter = 10; counter >= 0; counter-- )
; // Do something
额外的信息很少值得关注这些类型的错误。
答案 4 :(得分:0)
这可能是一个“小”的迟到,但只是发现了问题,并希望添加一个缺失的位。
负值完全合理的一个主要例子是图形框架。对于尺寸,如问题中所述,负面是不可能的,但对于位置值,具有负值是完全可以接受的。这些值使对象显示在屏幕外或至少部分裁剪:
它遵循与数学中相同的原理,负坐标只是使点转向轴的增长值的对立点。假设(0,0)位于屏幕的左上角,负值将事物移位到该点的左侧和顶部,使它们半可见。
如果要实现滚动区域,其内容大于可用空间,则此选项非常有用。简单地说,所有物体位置都变为负值,从顶部开始消失,或者从底部消失的高度消失。
此类事情不仅限于C#。根据问题,Winforms和WPF使用它,但大多数其他图形环境具有相同的行为。 HTML + CSS可以以相同的方式放置元素,或者C / C ++库SDL也可以使用此效果。