代码之家  ›  专栏  ›  技术社区  ›  KGB91

初始化一个用C存储函数的字典#

  •  1
  • KGB91  · 技术社区  · 6 月前

    我有一个程序,如下所示。我想初始化一个存储函数的字典。但是,编译器不允许我这样做,如下所示。我得到错误:

    CS1950最佳重载Add方法'字典<函数,字符串>。集合初始值设定项的Add(Func,string)'有一些无效的参数FuncDictonaryTest

    但如果我尝试在构造函数中执行,它就可以很好地工作。为什么?

    namespace FuncDictonaryTest
    {
        internal class Program
        {
            private Dictionary<Func<bool>,
                               string> FunctionDictonary = new()
                               {
                                    { TestA, "Hello" },
                                    { TestB, "Byebye" }, // Not working
                                };        
            
            private Dictionary<Func<bool>,
                               string> FunctionDictonaryTwo;
    
            Program()
            {
                FunctionDictonaryTwo = new() // Working
                {   
                    { TestA, "Hello" },
                    { TestB, "Byebye" }
                };
            }
    
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
            }
    
            private bool TestA()
            {
                return true;
            }        
            
            private bool TestB()
            {
                return false;
            }
        }
    }
    
    1 回复  |  直到 6 月前
        1
  •  3
  •   Guru Stron    6 月前

    实际上,您应该在这里得到两个错误(集合中的每个元素),第二个错误解释了实际问题( demo @sharplab ):

    错误CS1921:最佳重载方法与“程序”匹配。TestA()'的初始化器元素签名错误。可初始化的Add必须是可访问的实例方法。

    如果你改变 TestA () => TestA() 在现场初始化中,错误变得更加明显( demo @sharplab ):

    private Dictionary<Func<bool>, string> FunctionDictonary = new()
    {
        { () => TestA(), "Hello" },
        { () => TestB(), "Byebye" },
    };  
    

    错误CS0236:字段初始化器不能引用非静态字段、方法或属性“程序”。测试A()'
    错误CS0236:字段初始化器不能引用非静态字段、方法或属性“程序”。测试B()'

    不能在字段/属性初始化器中使用非静态成员。

    The field docs 可以解释一下原因:

    声明字段时,可以使用赋值运算符为字段赋予初始值。
    字段在对象实例的构造函数被调用之前立即初始化。

    还有

    字段初始值设定项不能引用其他实例字段。

    如果你愿意 测试A TestB 方法 static 错误也会消失( demo @sharplab )