C#Dictionary意外返回null

anu*_*r2k 3 c# null dictionary

假设我有这段代码:

public static class Converters {
  public static Dictionary<Unit, Dictionary<string, Func<float, float>>> ConverterDictionary =
    new Dictionary<Unit, Dictionary<string, Func<float, float>>> 
    {
        {
            Unit.MS, new Dictionary<string, Func<float, float>>() {
                {"m/s -> km/h", MStoKMH },
                {"m/s -> mph", MStoMPH }
            }
        }
    };

    private static Func<float, float> MStoKMH = val => val * 3.6f;
    private static Func<float, float> MStoMPH = val => val * 2.23693629f;
}

public enum Unit {
    MS
}
Run Code Online (Sandbox Code Playgroud)

我在其他地方尝试使用以下代码MStoKMHConverterDictionary(并调用它)中检索函数:

Func<float, float> test = Converters.ConverterDictionary[Unit.MS]["m/s -> km/h"];
float x = test(5);
Run Code Online (Sandbox Code Playgroud)

但最后一行抛出一个NPE("测试为空").为什么我的代码无法检索MStoKMH功能?

Jos*_*osh 8

声明MStoKMH和MStoMPH变量第一.

当它们像这样静态时,它们会按顺序初始化.因此,在创建字典时,这些变量仍为空.

从C#规范的10.5.5开始:

因此,在初始化类时,首先将该类中的所有静态字段初始化为其默认值,然后以文本顺序执行静态字段初始值设定项.

  • 更好的是:**在静态构造函数中进行初始化**.然后就会清楚地知道发生了什么事. (4认同)