昨天跟看到一篇帖子,说的是C#里面针对byte类型的计算,+号操作符和+=操作符对于数据类型的隐式转换有两种不同的处理方式,例如下面的代码是不能编译通过的:
using System;
public class ByteOp { public static void Main() { byte b = 1; b = b + 1; } } |
使用csc.exe编译的结果是:
ByteOp.cs(8,13): error CS0266: Cannot implicitly convert type 'int' to 'byte'.
An explicit conversion exists (are you missing a cast?)
编译器报告说第8行有错误,因为在第8行,1是当作整型(int)来处理的,而b + 1的结果根据隐式转换的规则是整型,你当然不能将一个整型隐式赋值给byte型的变量啦。
然而有趣的是,下面的代码竟然能够编译通过,天!人和人之间的区别咋就这么大呢?
using System;
public class ByteOp { public static void Main() { byte b = 1; b += 1; } } |
关于+符号,这个好理解,小容量的类型(byte)和大容量的类型(int)相加的结果应该是按照大容量的类型计算,否则以小容量计算的话就极容易发生溢出。
但是相似的概念也应该应用在+=符号才对呀,为什么会是上面的结果呢?我们来看看C#规范怎么说。
发生这个差别实际上是由于C#的语法造成的,而且我怀疑其他C家族的语言都应该有类似的行为。让我们看看C#的语法是怎么说的,你可以在Visual Studio的安装目录找到C#语言的规范:D:/Program Files/Microsoft Visual Studio 9.0/VC#/Specifications/1033/CSharp Language Specification.doc。
在C#规范的第219页(如果你用的也是C# 3.0的话),或者说7.16.2节,有下面一段话:
· If the return type of the selected operator is implicitly convertible to the type of x, the operation is evaluated as x