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

Cha*_*eck 6 .net c# compiler-warnings

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

d.word[wrdIndex++] = d.GetWord(english) | (ulong)i;
Run Code Online (Sandbox Code Playgroud)

警告适用于赋值运算符后的代码.方法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);
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?

Eri*_*ert 17

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

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

谢谢你这个好问题!


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

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

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


Cod*_*aos 6

int i=-1;                 // =         0xFFFFFFFF
ulong u1=(ulong)i;        // = 0xFFFFFFFFFFFFFFFF
ulong u1a=(ulong)(long)i; // = 0xFFFFFFFFFFFFFFFF
ulong u2=(ulong)(uint)i;  // = 0x00000000FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

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