2011-10-11 133 views
1

我一直在C#中编写一个相当低级别的应用程序,它使用大量的字节短语和位操作。我注意到的一件事是C#不喜欢进行位操作,并且使用除int之外的其他任何布尔运算符。这导致了我的代码遍布了数百个代码。错误,如“无法隐式转换类型‘诠释’到‘USHORT’。一个显式转换存在(是否缺少强制转换?)”在C中讨厌的强制转换#

byte b1 = 0x22; 
byte b2 = 0x33; 
ushort s1 = b1 << 8; // <-- Error Here 
ushort s2 = s1 | b2; // <-- And Here 

这迫使我使用蒙上无处不在。

byte b1 = 0x22; 
byte b2 = 0x33; 
ushort s1 = (ushort)(b1 << 8 | b2); 

这应该至多是一个警告。即使b1和b2类型的ushort仍然是错误的。即使添加等基本算术也会导致相同的错误。

ushort s1 = 0x22; 
ushort s2 = s1 + 0x11; // <-- Oh Come On. 
ushort s3 = 8; 
ushort s4 = (s1 << s3 | s2); // <-- Still an Error. 

反正是有解决这个还是我只是对自己辞职的事实,强制转换只是一个C#生活的一部分,当涉及到使用非整数其它任何东西,或只是使用C++在那里,这不是一个问题。

+3

或者你可以使用'int's。 – Gabe

+0

无论出于何种原因,字节数据类型都有这些奇怪的限制,其他人不这样做。转换标记是明确的,所以你必须投它们。 – Joe

+0

关于'ushort s2 = s1 + 0x11;',请参阅http://stackoverflow.com/questions/4343624/integer-summing-blues-short-short-problem/4347752#4347752 –

回答

1

不幸的是,没有办法解决这个问题。这就是语言的设计方式(事实上它比语言更深入,并且进入所有按位逻辑都以Int32数据类型执行的CLR)。

您可以继续进行强制转换,创建包装函数/类或切换到不安全/ C++代码并在那里执行。

3

如果您查看调试器中的本机代码,您会发现几乎所有的算术运算都是以整数形式完成的。我得出的结论是,要做的最好的事情是在我的代码中反映这一点,通过为本地人使用整数并仅在将值复制到我的数据结构时进行投射。