假设我有这段代码:
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
函数?
答案 0 :(得分:8)
首先声明MStoKMH和MStoMPH变量 。
当他们像这样静态时,他们会按顺序初始化。因此,在您创建字典时,这些变量仍为空。
从C#规范的10.5.5开始:
因此,当初始化类时,该类中的所有静态字段都是 首先初始化为默认值,然后是静态字段 初始化程序以文本顺序执行。