我一直在C#中编写一个使用大量字节短路和位操作的低级应用程序。我注意到的一件事是C#不喜欢进行位操作并且在除了int之外的任何东西上使用布尔运算符。这导致了我的代码中的100个演员阵容。错误,例如“无法将类型'int'隐式转换为'ushort'。存在显式转换(您是否错过了转换?)”
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 ++。
答案 0 :(得分:3)
如果你查看调试器中的本机代码,你会发现几乎所有这些算法都是以int的形式完成的。我得出的结论是,最好的办法就是在我的代码中通过对本地人使用int来反映这一点,并在将值复制到我的数据结构时进行转换。
答案 1 :(得分:1)
不幸的是,没有办法解决这个问题。这就是语言的设计方式(事实上它比语言更深入,并且进入CLR,其中所有按位逻辑都作为Int32数据类型执行。)
您可以继续执行强制转换,创建包装函数/类或切换到unsafe / C ++代码并在那里执行。