转换值类型常量

时间:2014-04-30 20:00:07

标签: c# casting constants

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

我有一个静态类,其中定义了一个常量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)CONSTANTINTEGER,还是每个循环都将整数转换为浮点数?

1 个答案:

答案 0 :(得分:4)

语言规范可以帮助我们解决这个问题。 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.

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