C# 委托-方法名称应为错误
我正在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
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);
}
您的委托是如何声明的?哦,太好了,非常感谢你的回答。这对我帮助很大。