在C#中将两个字节变量的加法结果分配给另一个字节变量产生错误,只能分配给int变量[duplicate]

问题描述 投票:2回答:1

这个问题在这里已有答案:

我有以下代码 -

using System;

namespace MyApp {
class Program {
    static void Main() {
        byte x = 10, y = 20;
        Console.WriteLine(x.GetType());
        Console.WriteLine(y.GetType());
        //byte z = (x+y); Error: (9,14): error CS0266: 
        //Cannot implicitly convert type 'int' to 'byte'. 
        //An explicit conversion exists (are you missing a cast?)
        byte z = (byte)(x+y);
        Console.WriteLine(z.GetType());
        Console.WriteLine(x);
        Console.WriteLine(y);
        Console.WriteLine(z);
    }
}
}

输出:

System.Byte
System.Byte
System.Byte
10
20
30

但是如果使用byte z = x+y而不是显式类型转换,它会产生错误 -

(9,14): error CS0266: Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)

但是如代码所示,编译器将xy读为字节。

那么,为什么添加两个字节会产生需要显式类型转换的int?

c# casting int byte implicit-conversion
1个回答
2
投票

这是Implicit Conversion的一个例子。

此链接进一步说明:

https://blogs.msdn.microsoft.com/oldnewthing/20040310-00/?p=40323

人们抱怨以下代码引发警告:

byte b = 32; byte c = ~b; // error CS0029: Cannot implicitly convert type 'int' to 'byte'

“对'byte'的操作结果应该是另一个'byte',而不是'int',”他们声称。

要小心你的要求。你可能不喜欢它。

假设我们生活在一个幻想世界中,'byte'上的操作导致'byte'。

byte b = 32; byte c = 240; int i = b + c; // what is i?

在这个幻想世界中,我的价值将是16!为什么?因为+运算符的两个操作数都是字节,所以总和“b + c”被计算为一个字节,由于整数溢出导致16。 (而且,正如我前面提到的,整数溢出是新的安全攻击向量。)

同样的,

int j = -b;

由于同样的原因,会导致j具有值224而不是-32。 ...在我们想象的世界中,一旦游戏总数超过255,此代码将返回不正确的结果。要修复它,您必须插入烦人的int强制转换。

return ((int)captain.Wins + cocaptain.Wins) >= ((int)captain.Games + cocaptain.Games) / 2;

因此,无论你如何切片,你都必须插入令人讨厌的演员阵容。也许安全方面的语言是错误的(强迫你在你知道溢出不是问题的地方插入演员表)而不是在沉默方面犯错误(在你的工资部门之前你可能不会注意到丢失的演员表)问你为什么他们的书在月底没有加起来)。

© www.soinside.com 2019 - 2024. All rights reserved.