C#中的复合赋值 [重复]

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

谁能给我解释一下,如何输出的 Console.WriteLine(a); 在这个代码块中,等于44.谁能给我解释一下,在这个代码块中,Console.WriteLine(a);的输出如何等于44。

byte a = 200;
byte b = 100;
var c = a + b;
Console.WriteLine(c.GetType());  // output: System.Int32
Console.WriteLine(c);  // output: 300

a += b;
Console.WriteLine(a.GetType());
Console.WriteLine(a);  // output: 44
Console.ReadLine();
c#
1个回答
2
投票

这一行。

a += b;

相当于这一行:

a = (byte) (a + b);

.... 除了 a 只评估一次。的结果是 a + b 属于 int (本例中的值为300),并投向 byte 将其截断为8位(即 byte 类型),留下的结果是44。

来自ECMA C# 5标准的第12.18.3节。

这种形式的操作 x op= y 通过应用二进制运算符过载解析(§12.4.5)进行处理,就像操作被写成那样 x op y. 那么..,

  • 如果所选操作符的返回类型隐含地可转换为x的类型,则该操作被评估为 x = x op y但是 x 只被评估一次。
  • 否则,如果所选操作符是一个预定义操作符,如果所选操作符的返回类型显式地转换成了 x,如果 y 隐含着可转换为类型的 x 或操作者是一个轮班操作者,那么操作被评估为 x = (T)(x op y),其中 T 是一种 x但是 x 只被评估一次。
  • 否则,复合赋值无效,并发生绑定时间错误。
© www.soinside.com 2019 - 2024. All rights reserved.