C# 字节=字节-字节需要类型转换?

C# 字节=字节-字节需要类型转换?,c#,.net,c#-3.0,C#,.net,C# 3.0,我有以下代码: foreach (byte b in bytes) { byte inv = byte.MaxValue - b; // Add the new value to a list.... } 当我执行此操作时,会出现以下错误: Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?) 无法将类型“int”隐式转换为

我有以下代码:

foreach (byte b in bytes)
{
    byte inv = byte.MaxValue - b;
    // Add the new value to a list....
}
当我执行此操作时,会出现以下错误:

Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?) 无法将类型“int”隐式转换为“byte”。 存在显式转换(是否缺少强制转换?) 此语句的每个部分都是一个字节。为什么C#要将
byte.MaxValue-b
转换为int

你不应该不施法就能做到这一点吗?(也就是说,我不想这样做:
byte inv=(byte)(byte.MaxValue-b);

根据以下内容:

因为赋值运算符右侧的算术表达式在默认情况下计算结果为int


这可能是因为处理器访问4字节内存地址的速度比访问1字节内存地址的速度快,因此定义算术运算符处理4字节操作数。

对于加法、乘法和减法,有一个相当好的解释:在计算中包含进位,然后将它们扔掉,要比计算出最初扔掉的进位容易得多

对于位运算符(交集、包含并集、独占并集、补集),这种推理根本站不住脚。我能想到的唯一一件事是,如果从有符号操作数和无符号操作数的混合开始,然后将结果保存在更宽的类型中,那么符号扩展将有点模糊。但这并不能解释为什么一元或所有操作数类型相同的按位运算会将结果扩大到
int
。我认为这是一个非常恼人的设计缺陷:
生成错误。

Raymond Chen在此处回答您的问题:


我想问题是为什么?当我执行
intint
时,它不会导致
int64
。为什么在类型为
字节字节时自动升级该类型?@Vaccano:我的猜测是,算术运算符只需定义为与特定长度的操作数(4字节和8字节)一起工作,但我只是在猜测。即使MSIL只支持模件2**32算术,当需要将结果存储到与操作数一样窄的变量中时,C#编译器仍然可以自由插入窄化转换。@Ben Voigt:我本能地不希望编译器为我插入窄化转换。但是,我假设在本例中,您通过将结果分配给一个字节,隐式地告诉它进行强制转换。我在您的逻辑中找不到任何错误。我只希望编译器在符合类型系统时插入类型转换。因为在我看来,将byte&byte的结果保存到另一个字节是类型安全的,所以编译器可以使用任何最有效的指令序列来实现这一点。如果这恰好是一个32位的宽度,然后是一个变窄转换,那么它没有破坏类型安全性,所以在我看来这是完全正常的。Raymond没有处理按位操作,并且在评论中提到了这一点。你想评论一下为什么不/和/或/XOR原因促销?我同意你的总体观点,但这不是C#而不是.NET中的“恼人的设计缺陷”吗?例如,F#定义返回字节的字节的逻辑和算术运算。
byte a, b;
byte c = a | b;