我一直在用 C# 编写一个相当低级别的应用程序,它使用大量字节短裤和位操作。我注意到的一件事是 C# 不喜欢对除整数以外的任何东西进行位操作和使用 bool 运算符。这导致我的代码中出现了 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 where 是 ushort 类型,它仍然是一个错误。即使是加法等基本算术也会出现同样的错误。
ushort s1 = 0x22;
ushort s2 = s1 + 0x11; // <-- Oh Come On.
ushort s3 = 8;
ushort s4 = (s1 << s3 | s2); // <-- Still an Error.
不管怎样,在使用除整数以外的任何东西时,我是否只需要接受这样一个事实,即强制转换只是 C# 生活的一部分,或者在这不是问题的情况下只使用 C++。
最佳答案
如果您查看调试器中的 native 代码,您会发现几乎所有这些算术无论如何都是作为整数完成的。我得出的结论是,最好的办法是在我的代码中反射(reflect)这一点,方法是对局部变量使用 int 并仅在将值复制到我的数据结构中时进行强制转换。
关于c# - C# 中恼人的强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7720599/