2017-05-31 31 views
2

已经使用指数运算符^来初始化一个VB类的公共常量,后面跟着this question如何在常量表达式中取幂?

Public Const MaxValue As Double = MaxMantissa * (2^MaxExponent) 

我将该类转换为C#。但我发现C#没有相同的运算符(^仍然是一个运算符,但只是按位异或)。

Math.Pow()given as an alternative给操作员,但不能用于常量表达式。那么如何在C#中用一个指数表达式来初始化一个常量?

(我不使用值而不是表达式,因为表达式中的值也是常量,来自不同的地方。MaxExponent来自基类,MaxMantissa在每个派生类中是不同的。此外还有多个常量像这样在每个派生类,如MaxPositiveValueMinPositiveValueMinNegativeValueMaxNegativeValue等)

+1

C#没有电源运营商。 – Tvde1

+0

@ Tvde1是的,我在问题中已经说过了。我问是否有一个常量表达式的替代方法。 – Toby

+4

'<<'在有限的情况下工作,除此之外,你只是运气不佳 – harold

回答

4

由于你的具体情况,你想提高到MaxExponent功率

2 ** MaxExponent 

,你可以把它看成左移一个,但是当且仅当MaxExponent小的正整数值:

1 << MaxExponent 

喜欢这个

// double: see comments below `1L` stands for `long` and so MaxExponent = [0..63] 
public const double MaxValue = MaxMantissa * (1L << MaxExponent); 

一般情况下 (当MaxExponent是任意的double值时),您可以尝试将const更改为readonly

public static readonly double MaxValue = MaxMantissa * Math.Pow(2.0, MaxExponent); 
2

基本上(除了,如上所述,对于可以通过移位运算符获得的2的幂的平凡情况除外)。

您可以对该值进行硬编码并添加注释,也可以使用static readonly,但请注意static readonly不具有相同的“烘焙到调用站点”语义。在大多数案件不会出现问题。