为什么我的const或静态成员没有初始化?

0 c# static initialization const static-initialization

我一直在抓挠这个问题.我怀疑我;我只是在这里愚蠢,但我似乎无法获得const或静态成员进行初始化,所以我可以在整个课程中使用它.

这是一个展示我的问题的例子(或者更确切地说是我的误解):

using System;

namespace ConstExample
{
  public class HasImmutableMember
  {
    // static private double fSectionLengthTolerancePerInch = 1 / (20 * 12);  // tolerance is 1" per every 20'
    private const double fSectionLengthTolerancePerInch = 1 / (20 * 12);  // tolerance is 1" per every 20'

    static HasImmutableMember()
    {
      Console.WriteLine("static c'tor: " + fSectionLengthTolerancePerInch);
    }

    public HasImmutableMember()
    {
      Console.WriteLine("instance c'tor: " + fSectionLengthTolerancePerInch);
    }
  }

  public class Program
  {
    public void Main(string[] args)
    {
      HasImmutableMember instance = new HasImmutableMember();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出是:

static c'tor: 0
instance c'tor: 0
Run Code Online (Sandbox Code Playgroud)

无法在const成员声明中设置断点,但如果我使用静态版本,我可以.两者都没能给我我想要的东西.静态成员声明确实在静态c'tor或实例c'tor之前被命中.正如预期的那样,静态c'tor在实例c'tor之前被击中.但是在static和instance c'tor中,我的成员的值是0而不是初始值.

我错过了什么?

Eri*_*ert 5

这是一个经典的"转换为时已晚"的缺陷,我希望C#编译器警告它.您正在以整数执行所有算术运算,然后将结果分配给double.结果是一个整数,1 / 240整数为零.做双打算术:1.0 / 240.0.

我们也看到这个涉及非常数的缺陷,例如,

percentDone = doneSoFar / totalWork;
Run Code Online (Sandbox Code Playgroud)

如果被除数是整数而结果是双,则结果可能为零.

还要注意涉及乘法的相同"转换太晚"缺陷:

double microseconds = seconds * 1000000;
Run Code Online (Sandbox Code Playgroud)

如果seconds是int并且超过几千,那么它指定为double 之前,它将在整数中溢出,而不是你想要的,这是先转换为double并在双精度中进行乘法运算.同样,应该1000000.0向编译器提示您希望以更高的精度完成操作.