You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:52:07