c# - 委托(delegate) - 方法名称预期错误

标签 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;
    }
    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);
}    

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

最佳答案

问题是您正在尝试使用裸 Delegate类型就好像它是一个特定的委托(delegate)类型。如果您将字典更改为:

Dictionary<string, Func<decimal, double>>

然后该错误消失了 - 但您将无法添加 Func<decimal, decimal>作为字典中的一个值,当然......或Func<decimal, decimal, decimal> .

可以使用 Delegate.DynamicInvoke 如果您不想将自己绑定(bind)到特定的委托(delegate)类型 - 但您仍然在处理您期待 double 的事实时遇到问题返回值但调用返回 decimal 的委托(delegate).如果你只是转换 DynamicInvoke 的结果,你会得到一个拆箱错误。至 double .

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

基本上,您需要使字典中的值更加一致。

关于c# - 委托(delegate) - 方法名称预期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18375292/

相关文章:

c# - 使用 CaSTLe Windsor 为单个接口(interface)注册多个组件

c# - Mongodb Bson类型转Json

c# - 如何为所有语言创建 DLL

c# - 在 Mono/Linux 中使用 FFmpeg.Autogen 4.1.0.2 时找不到 Kernel32

ios - 子类如何继承父类委托(delegate)?

c# - 使用列表作为线程启动例程的参数时出现索引超出范围错误

Objective-c 用它的后代类型覆盖委托(delegate)

c# - 读取csv文件忽略双引号和标题内的逗号

java - java中指定一个对象方法作为参数

ios - 如何在 UINavigationController 中获得弹出 View 的通知?