c# – 为什么编译器不喜欢隐式地转换为uint?
发布时间:2020-12-15 23:52:14 所属栏目:百科 来源:网络整理
导读:我在C和C#中遇到了关于uint使用的几个类似的怪癖,现在我想知道推理(对于每个例子可能完全不同).对于这两个示例,请注意我正在编译时将警告级别设置为最大值. (1)gcc抱怨在下面比较int和uint,而vc没有: uint foo = somevalue;if( foo == ~0 ) //right here ..
我在C和C#中遇到了关于uint使用的几个类似的怪癖,现在我想知道推理(对于每个例子可能完全不同).对于这两个示例,请注意我正在编译时将警告级别设置为最大值.
(1)gcc抱怨在下面比较int和uint,而vc没有: uint foo = <somevalue>; if( foo == ~0 ) //right here ... 比较0就可以了,没有在gcc和vc上进行任何转换. (2)在C#3.5中,我遇到了一个类似的问题.以下工作正常: uint foo = 1; uint bar = 2; 但这会给出一个uint / int警告: bool condition = <somevalue>; uint foo = condition ? 1 : 2; //right here 是什么给出了,为什么编译器对立即值的签名如此敏感?我完全理解从变量赋值时的问题,但这对我来说对于直接值是没有意义的;在解析中是否存在一些隐藏的难以阻止此行为被允许?或者是什么? 编辑:是的,我知道我可以用’你’来填充我的数字,但是这可以回避我的问题,即隐含地向左侧投射,而不是明确地施放右侧. 解决方法
我不能说gcc,但对于C#3编译器,你需要明确地告诉它这些int应该是无符号的:
uint foo = condition ? 1U : 2U; C#编译器喜欢整数并假设范围内的所有整数值都是整数.由于您的表达式使用条件运算符,编译器太急于假设您的文字值是整数,然后分配失败. 编辑:请注意,我说的是System.Int32范围内的整数值.考虑这个例子: using System; class Program { static void Main() { Console.WriteLine(1.GetType()); Console.WriteLine(2147483648.GetType()); } } 输出:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |