C#初始化存储函数的Dictionary报错,构造函数中为何正常?
字段初始化Dictionary<Func, string>报CS1950,构造函数却正常的原因
我尝试初始化一个以Func<bool>为键、string为值的Dictionary,字段初始化时编译器报错CS1950,提示集合初始化器的Add方法参数无效,但在构造函数里执行完全相同的初始化操作却能正常运行,代码示例如下:
namespace FuncDictonaryTest { internal class Program { private Dictionary<Func<bool>, string> FunctionDictonary = new() { { TestA, "Hello" }, { TestB, "Byebye" }, // 此处报错CS1950 }; private Dictionary<Func<bool>, string> FunctionDictonaryTwo; Program() { FunctionDictonaryTwo = new() // 此处正常运行 { { TestA, "Hello" }, { TestB, "Byebye" } }; } static void Main(string[] args) { Console.WriteLine("Hello World!"); } private bool TestA() { return true; } private bool TestB() { return false; } } }
核心原因是字段初始化器的执行时机早于实例的创建:
- 字段初始化在类实例构造函数执行前完成,此时当前类实例尚未初始化。
TestA、TestB是实例方法,转换为Func<bool>委托需要绑定到已存在的实例,而此时实例不存在,编译器无法完成绑定,因此报错。 - 构造函数在实例创建后执行,此时实例已存在,实例方法可正常绑定到当前实例并转换为
Func<bool>委托,集合初始化器能正常工作。
如果把TestA和TestB改成静态方法,字段初始化器也能正常运行,因为静态方法不需要依赖实例,编译器可以直接解析。
内容的提问来源于stack exchange,提问作者KGB91
相关产品推荐
相关产品推荐

