以下C#代码生成警告:
var a = (ulong)5;
var b = a | (ulong)new int[10].Length;
在符号扩展的操作数上使用按位或运算符;考虑铸造 改成较小的无符号类型
此警告的原因是什么?在我看来,OR的两端都应具有静态类型ulong
,因此不应发生符号扩展。
答案 0 :(得分:4)
重点是Length
返回了int
* 。然后,您强制转换为ulong
,这导致了符号扩展(因为实际上,它首先通过了long
)。
如果在投射到uint
之前已经投射到ulong
,警告将消失 1 。
var a = (ulong)5;
var b = a | (ulong)(uint)new int[10].Length;
在很多方面,这可以归结为C#强制转换可以做不同的事情。有些根本不更改数据,而只是更改编译器的作用,而其他一些则需要实际转换。我有时会渴望现代C ++的reinterpret_cast
等。
* 是的,我们都知道Length
绝不会返回负数,因此此处的符号扩展名不是问题。但是,将无符号类型(通常为 )应委托给垃圾箱有多种原因。
例如,如果您要进行位操作,则通常会关心位,而不是如何将它们解释为数字。 ulong
和long
在这里通常没有意义,因为它不是数字,而是位字段。
1 即警告已经告诉您要做什么。首先转换为较小的无符号类型。