强制值类型常量

本文关键字:常量 类型 | 更新日期: 2023-09-27 18:00:55

这更像是一个学术问题,而不是我真正担心性能的问题。我只是真的很好奇。在我有限的编程经验中,我也了解到编译器只有一半的时间是聪明的。

我有一个静态类,其中定义了一个常数int,我需要将该常数除以另一个整数。现在,我需要一个从除法中返回的浮点值,所以我不能把它们都作为整数。

const int CONSTANTINTEGER = 69;
int integer = 0;
float floatValue = 0f;
for(integer = 0; integer < CONSTANTINTEGER; integer++) {
    float floatValue = integer / (float)CONSTANTINTEGER;
    //use floatValue for algorithm.....
}

现在,我的问题是:编译器是否足够聪明,可以创建一个常量float来代替(float)CONSTANTINTEGER,还是在每个循环中将整数强制转换为float?

强制值类型常量

语言规范在这里对我们有帮助。C#5规范第7.19节规定:

常量表达式必须是null文字或具有以下类型之一的值:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、object、string或任何枚举类型。常量表达式中只允许使用以下构造:

  • 强制转换表达式,前提是目标类型是上面列出的类型之一

只要表达式满足上面列出的要求,就会在编译时对该表达式进行求值。即使表达式是包含非常量构造的较大表达式的子表达式,也是如此。

您也可以通过查看IL来验证这一点,在本例中,IL具有:

IL_000a:  ldc.r4     69.

当它为除法运算加载除数时。