我明白为什么会产生编译时错误:
short x = 1;
short y = 2;
short z = x + y; // compile-time error
我已经掌握了为什么这样做没有任何问题:
short x = 1;
short y = 2;
x += y; // all right, because of c# specs section 7.17.2
但我不知道为什么这也有效:
short x = (short)1 + (short)2;
我希望得到与第一个示例中相同的编译时错误,但它运行成功...为什么?
答案 0 :(得分:3)
由于您使用的是常量值,编译器可以检测到它是允许的,在编译时评估它,并让它执行。生成的IL的计算结果与键入short x = 3;
的结果相同。
请注意以下内容也有效(出于同样的原因):
const short x = 1;
const short y = 2;
short z = x + y;
但这失败了:
const short x = 32000;
const short y = 32001;
short z = x + y;
请注意,这包含在C#语言规范,6.1.9隐式常量表达式转换中:
答案 1 :(得分:2)
您的上一个代码段只会编译为常量3
。编译器不需要调用int
中的任何运算符,它只是在编译时计算并存储该值。
与short x = 3;
这是生成的IL
IL_0001: ldc.i4.3 //Load the constant 3 into evaluation stack
IL_0002: stloc.0 // stores the value in stack to x
答案 2 :(得分:1)
我不知道为什么这也有效:
short x = (short)1 + (short)2;
编译器在编译时计算rhs表达式,并且可以证明结果在边界内。