c# - C# 中恼人的强制转换

标签 c# casting bit-manipulation boolean-operations

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

相关文章:

c# - 使用 Newtonsoft.Json 检测 json 对象的结尾

c# - Linq 模式匹配

c# - 无法使用 PRISM 5、MVVM 和 EF 6 在 WPF 中刷新 DataGrid

c# - 是否可以实现自定义安全转换(在任意抽象数据结构之间使用 "as")?

c - 仅返回字中偶数位的函数

java - 循环访问 java BigInteger 中的各个位

c# - 使用海洋在 Petrel 3D 窗口中绘制地震体积墙

Java 泛型 - 从 "capture#1 of ?"到 "A"的未经检查的强制转换

c# - 混淆 C# 枚举和显式转换

c - 按位和求值