【问题标题】:Why can't I do boolean logic on bytes?为什么我不能对字节进行布尔逻辑?
【发布时间】:2009-06-18 09:20:47
【问题描述】:

在 C# (3.5) 中,我尝试以下操作:

byte byte1 = 0x00;
byte byte2 = 0x00;
byte byte3 = byte1 & byte2;

我收到错误 132:“无法将类型 'int' 隐式转换为 'byte'。存在显式转换(您是否缺少强制转换?)”。 | 也会发生同样的情况和^。

我做错了什么?为什么它问我整数?为什么我不能对字节做布尔逻辑?

【问题讨论】:

  • .NET 中的所有算术都基于 int。有一个相关的问题进行了相当多的讨论。这不是您问题的答案,但您可能会对 C# 如何处理一般算术有所了解:stackoverflow.com/questions/941584/byte-byte-int-why
  • “因为 C# 不是一门完美的语言”,我将如何解释这一点。这是它的缺点之一(与其他语言相比,C# 的缺点是迄今为止最少且影响最小的......)

标签: c# .net byte boolean-logic


【解决方案1】:

没有为 byte 声明各种运算符 - 两个操作数都被提升为 int,结果是 int。比如加法:

byte byte1 = 0x00;
byte byte2 = 0x00;
byte byte3 = byte1 + byte2; // Compilation error

请注意,复合作业确实有效:

byte1 += byte2;

有一个recent SO question on this。我同意这对于按位运算来说尤其令人讨厌,因为结果应该始终是相同的大小,而且它在逻辑上是完全有效的运算。

作为一种解决方法,您可以将结果转换回字节:

byte byte3 = (byte) (byte1 & byte2);

【讨论】:

  • C# 将 byte+byte 评估为“int”类型可能令人讨厌,如果想要将结果分配回一个字节,则需要进行类型转换,但 vb.net 更糟。 'Byte' 类型的两个变量或定义的常量将被添加为 'Byte' 类型(如果结果大于 255,即使将其分配给 'Integer' 也会死亡),但用于除直接赋值被视为整数。很好,尽管 vb.net 处理布尔操作最明智(x And y 的大小应该是,但不是,如果有的话,smaller 无符号操作数)。
【解决方案2】:

因为字节(和短)类型不实现这些运算符

参见规范:4.1.5

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2020-07-11
    相关资源
    最近更新 更多