如何抑制C#警告CS0675:在符号扩展操作数上使用按位或运算符

时间:2010-10-30 13:47:30

标签: c# .net compiler-warnings

我似乎无法摆脱以下代码行的警告:

d.word[wrdIndex++] = d.GetWord(english) | (ulong)i;

警告适用于赋值运算符后的代码。方法GetWord返回一个ulong。我试过以下无济于事:

d.word[wrdIndex++] = (d.GetWord(english) | (ulong)i);
d.word[wrdIndex++] = d.GetWord(english) | ((ulong)i);
d.word[wrdIndex++] = ((ulong)d.GetWord(english)) | ((ulong)i);

有人有什么想法吗?

3 个答案:

答案 0 :(得分:17)

更新:这个问题是我博客2010年11月29日星期一的主题:

http://blogs.msdn.com/b/ericlippert/archive/2010/11/29/bit-twiddling-what-does-warning-cs0675-mean.aspx

感谢您提出的好问题!


首先考虑警告并决定编译器是否正确地将问题引起您的注意,从而摆脱警告! 您实际上是否会从按位获取不正确的结果,或者从有符号类型转换为较大的无符号类型是否会扩展整数?

如果答案是,那么您的解决方案是错误的。不要在没有给出警告的情况下欺骗编译器仍然做错的事情来消除警告。通过做正确的事来消除警告:不要使用符号扩展整数的转换。

如果答案是,并且您想要符号扩展名,那么您的解决方案或Hans Passant的解决方案是正确的。但是,我会在代码中对此结果发表评论,因为就目前而言,很难看到符号扩展是可取的。

答案 1 :(得分:6)

int i=-1;                 // =         0xFFFFFFFF
ulong u1=(ulong)i;        // = 0xFFFFFFFFFFFFFFFF
ulong u1a=(ulong)(long)i; // = 0xFFFFFFFFFFFFFFFF
ulong u2=(ulong)(uint)i;  // = 0x00000000FFFFFFFF

所以从int到ulong的转换对应于第一个符号扩展到(signed)long,然后丢弃符号。

答案 2 :(得分:2)

抱歉,刚刚摆脱它:

ulong w = d.GetWord(english);
ulong u = (ulong)i;
d.word[wrdIndex++] = w | u;
相关问题