1

我一直在用 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++。

4

2 回答 2

3

如果您查看调试器中的本机代码,您会发现几乎所有这些算术都是以整数形式完成的。我得出的结论是,最好的办法是在我的代码中反映这一点,方法是在我的代码中使用整数作为本地变量,并且仅在将值复制到我的数据结构中时进行强制转换。

于 2011-10-11T01:57:57.460 回答
1

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

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

于 2011-10-11T01:56:45.733 回答