C# 委托-方法名称应为错误

C# 委托-方法名称应为错误,c#,delegates,C#,Delegates,我正在c#上写一个控制台计算器。我需要以下代码开始工作: Dictionary<string, Delegate> functions = new Dictionary<string, Delegate>(); private void AddMyFunction (Delegate d, string name) { if (name == null) { name = d.Method.Name; } function

我正在c#上写一个控制台计算器。我需要以下代码开始工作:

Dictionary<string, Delegate> functions = new Dictionary<string, Delegate>();

private void AddMyFunction (Delegate d, string name)
{
    if (name == null)
    {
        name = d.Method.Name;
    }
    functions.Add (name, d);
}

public void AddFunction (Func<decimal, decimal> f, string name)
{
    AddMyFunction (f, name);
}

public void AddFunction (Func<decimal, decimal, decimal> f, string name)
{
    AddMyFunction (f, name);
}        

public double PerformOperation (string op, decimal x)
{
    return functions [ op ] (x);
}    
Dictionary functions=newdictionary();
私有void AddMyFunction(委托d,字符串名称)
{
if(name==null)
{
name=d.Method.name;
}
功能。添加(名称,d);
}
public void AddFunction(函数f,字符串名)
{
AddMyFunction(f,name);
}
public void AddFunction(函数f,字符串名)
{
AddMyFunction(f,name);
}        
公共双性能运算(字符串运算,十进制x)
{
返回函数[op](x);
}    

在函数“PerformOperation”中出现错误:“预期的方法名称”。请帮助他人。

问题在于,您试图使用裸
委托类型,就好像它是一种特定的委托类型一样。如果将词典更改为:

Dictionary<string, Func<decimal, double>>
字典
然后这个错误就消失了-但是你不能在字典中添加一个
Func
作为值,当然。。。或
Func

如果您不想将自己绑定到特定的委托类型,则可以使用,但是您仍然无法处理这样一个事实,即您希望返回一个
double
返回值,但调用一个返回
十进制的委托。如果将
DynamicInvoke
的结果强制转换为
double
,则会出现取消装箱错误

还有一个问题是,您试图调用的委托可能有两个参数,而您只提供了一个参数

基本上,您需要更加一致地确定字典中的值是什么。

将其更改为:

public decimal PerformOperation (string op, decimal x)
{
    return (decimal)(functions[op].DynamicInvoke(x));
}  
它会起作用的。不过,我还是推荐一些强类型的。可能会保留多个字典,每种委托类型对应一个字典,如下所示:

Dictionary<string, Func<decimal, decimal>> func1;
Dictionary<string, Func<decimal, decimal, decimal>> func2;

public void AddFunction (Func<decimal, decimal> f, string name)
{
    func1.Add(name, f);
}

public void AddFunction (Func<decimal, decimal, decimal> f, string name)
{
    func2.Add(name, f);
} 

public decimal PerformOperation (string op, decimal x)
{
    return func1[op](x);
}

public decimal PerformOperation (string op, decimal x, decimal y)
{
    return func2[op](x, y);
}
1;
字典功能2;
public void AddFunction(函数f,字符串名)
{
功能1.添加(名称,f);
}
public void AddFunction(函数f,字符串名)
{
功能2.添加(名称,f);
} 
公共十进制运算(字符串运算,十进制x)
{
返回函数1[op](x);
}
公共十进制性能操作(字符串op、十进制x、十进制y)
{
返回函数2[op](x,y);
}

您的委托是如何声明的?哦,太好了,非常感谢你的回答。这对我帮助很大。