C#Dictionary意外返回null

时间:2018-06-18 22:51:21

标签: c# dictionary null

假设我有这段代码:

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
}

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

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

但最后一行抛出一个NPE(“测试为空”)。为什么我的代码无法检索MStoKMH函数?

1 个答案:

答案 0 :(得分:8)

首先声明MStoKMH和MStoMPH变量

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

从C#规范的10.5.5开始:

  

因此,当初始化类时,该类中的所有静态字段都是   首先初始化为默认值,然后是静态字段   初始化程序以文本顺序执行。