c#编译器对byte类型的一些规则
csc在处理byte类型时,其实是有一些规则的,平时我们写代码可能没有注意。
举个例子:
//有几行这样的代码
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());
猜测一下GetType()之后输出的结果是什么呢?我相信肯定有些人会理所当然说是byte 了,
那么你错了 。其实应该是System.Int32类型的,被注释的代码其实是有问题的。
这个问题可以说是编译器在处理byte类型的运算的一个规则,在byte类型上运用+,-,*,/运算符时,
举个例子:
//有几行这样的代码
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());
static void Main()
{
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());
Console.WriteLine((a - b).GetType());
Console.WriteLine((a * b).GetType());
Console.WriteLine((a / b).GetType());
Console.Read();
}
{
byte a = 1;
byte b = 2;
//byte sum = a+b; //incorrect
Console.WriteLine((a + b).GetType());
Console.WriteLine((a - b).GetType());
Console.WriteLine((a * b).GetType());
Console.WriteLine((a / b).GetType());
Console.Read();
}
猜测一下GetType()之后输出的结果是什么呢?我相信肯定有些人会理所当然说是byte 了,
那么你错了 。其实应该是System.Int32类型的,被注释的代码其实是有问题的。
这个问题可以说是编译器在处理byte类型的运算的一个规则,在byte类型上运用+,-,*,/运算符时,
都被 隐式地转换为System.Int32类型了。所以注释的代码需要显示地转换为byte类型,如: sum = (byte)a+b。
上面的输出结果其实全是:System.Int32
说得这里,其实还有一个看起来更莫名其妙的规则,先看看,还是在先前的代码上小小修改了一些
static void Main()
{
byte a = 1;
byte b = 2;
byte c;
c = b + 1; //错误
c = b += 1; //正常
//输出结果?
Console.WriteLine((b + 2).GetType());
//这个输出又是什么呢?
Console.WriteLine((b+=2).GetType());
Console.Read();
}
{
byte a = 1;
byte b = 2;
byte c;
c = b + 1; //错误
c = b += 1; //正常
//输出结果?
Console.WriteLine((b + 2).GetType());
//这个输出又是什么呢?
Console.WriteLine((b+=2).GetType());
Console.Read();
}
其实上面代码就一个小区别, + 与 += 的区别,很多人不明白 c = a += 1; 这个语句为什么可以编译通过,
a+=1 按 “道理” 来讲应该就是我们上面代码的测试结果,先计算右边的表达式值,得到 2赋给c 变量,所以理论上应该是 System.Int32类型的,应该报编译错误,其实不然,这也是编译器在处理 byte类型的一个运算规则,如果不是很明白,
我用refloctor再次对它剥离一次,看清楚它的真实面目。
private static void Main()
{
byte a = 1;
byte b = 2;
byte c = b = (byte) (b + 1); //注意这行
Console.WriteLine((b + 2).GetType());
//注意下面这行
Console.WriteLine((b = (byte) (b + 2)).GetType());
Console.Read();
}
{
byte a = 1;
byte b = 2;
byte c = b = (byte) (b + 1); //注意这行
Console.WriteLine((b + 2).GetType());
//注意下面这行
Console.WriteLine((b = (byte) (b + 2)).GetType());
Console.Read();
}
再看看上面的代码,一目了然了吧,编译器在处理 c = b+=1 时,直接把+=运算结果显示地转换为 byte类型了,怪不得不会编译出错,我想它应该就是编译器所谓的 “潜规则” 吧,:)
内容不多,但都是我们平时写代码时应该注意的一些问题,欢迎大家拍砖!
Author:repository
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。