如何强制运行时常量为编译时常量?

时间:2014-02-01 17:54:19

标签: c#

所以我正在研究一个基于化学的项目,并遇到了这个棘手的问题。我有一堆函数进行化学类型计算,并希望将avogadros数作为函数的默认参数传递。让我让代码说话:

class Constants 
{
    //must be readonly to b/c Math.Pow is calculated at run-time
    public static double readonly avogadrosNum = 6.022*Math.Pow(10,-22);
} 

class chemCalculations
{   //getting default parameter must be a compile-time constant
    public double genericCalc(double avogadrosNum = Constants.avogadrosNum);  
}

编辑:不知道指数格式,谢谢你们

4 个答案:

答案 0 :(得分:14)

总的来说,你不能。就编译器而言,任何涉及方法调用的内容都是而不是将成为编译时常量。

所做的是使用科学记数法表达double字面值:

public const double AvogadrosNumber = 6.022e-22;

所以在这个特定情况下你可以写它而不会损失可读性。

在其他设置中,只要类型是基本类型之一或decimal,您就可以将常量写为文字,并使用注释来解释如何获得它。例如:

// Math.Sqrt(Math.PI)
public const double SquareRootOfPi = 1.7724538509055159;

请注意,即使方法调用不能在常量表达式中使用,其他运算符也可以。例如:

// This is fine
public const double PiSquared = Math.PI * Math.PI;

// This is invalid
public const double PiSquared = Math.Pow(Math.PI, 2);

有关常量表达式中允许的内容的更多详细信息,请参阅C#5规范的第7.19节。

答案 1 :(得分:2)

将avogadro的数字定义为科学记数法:

class Constants 
{
    public double const avogadrosNum = 6.022e-22;
} 

答案 2 :(得分:2)

对于编译时常量,您需要使用const关键字。但是,要使用它,你的表达式本身也需要是一个编译时常量,正如你所注意到的:你不能使用诸如Math.Pow之类的函数。

class Constants
{
    public const double avogadrosNum = 6.022E-22;
}

如果你不能或不想将常量修改为编译时常量,则不能在编译时上下文中使用它,但是你可以通过重载来解决这个问题,这样运行时值就可以用作< em>排序一个默认参数:

class chemCalculations
{
    public double genericCalc() {
        return genericCalc(Constants.avogadrosNum);
    }
    public double genericCalc(double avogadrosNum) {
        // real code here
    }
}

(顺便说一下,常量的值是错误的,或者具有高度误导性的名称。它应该很可能是6.022E+23。)

答案 3 :(得分:1)

您可以采用指数格式:6.022E-22