为何C#中以int为键、Delegate为值的Dictionary无法内联初始化?
问题本质解析:字段初始化器为何不能引用非静态成员
这是个非常好的问题!其实核心原因和C#的类实例初始化顺序直接相关,咱们一步步拆解清楚:
1. 字段初始化器的执行时机
当你像这样直接在类中声明并初始化字段时:
public Dictionary<int, Delegate> delay = new Dictionary<int, Delegate>() { {0, new Func<IndicatorState, bool>(Proc) } };
这段初始化代码的执行时间是在类的构造函数运行之前。此时,当前类的实例还没有完全构造完成——简单说,this(代表当前实例的引用)还处于无效状态,所有属于实例的非静态字段、方法(包括你的Proc方法)都还不能被正常访问,因为它们依赖于一个还未被创建的实例。
2. 为什么构造函数里就可行?
构造函数的设计目的就是专门用来完成实例的初始化工作。当构造函数开始执行时,.NET已经为类实例分配了内存空间,this引用已经有效,此时你访问实例的非静态成员(比如Proc方法)就完全符合C#的规则了。
3. 结合你的代码看问题
你写的new Func<IndicatorState, bool>(Proc)其实是隐式引用了this.Proc(因为Proc是非静态方法,必须通过实例调用)。但在字段初始化阶段,this还不存在,所以编译器就抛出了那个错误:字段初始值设定项无法引用非静态字段、方法或属性‘name’。
如果把Proc改成静态方法,那字段初始化器里直接引用就不会报错——因为静态成员属于类本身,不需要依赖实例就能访问。
总结
字段初始化器的限制很明确:只能使用静态成员、常量,或者不依赖实例的表达式。但凡涉及到实例自身的非静态成员,都必须放到构造函数里去完成初始化。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

