无法隐式转换类型

时间:2016-02-09 21:57:44

标签: c# delegates

当我尝试对委托进行一些测试时,我遇到了障碍。我的目标是创建MyStates类的实例,这些实例能够调用我在MyFunctions类中定义的一些预定义函数。在类中,我有一个字典,它将按名称引用函数,并有一个函数检索函数的地址并将其放在MyState实例中,以便我可以在运行时引用它。这个想法似乎很简单,但编译器并不满意。我想我可能知道出了什么问题,但我不知道如何摆脱编译错误。请告知如何修复此编译器错误。

MyFunctions类的定义如下:

public sealed class MyFunctions
{
    public delegate int myFunction(object o);
    private static Dictionary<string, myFunction> funcRouter 
     = new Dictionary<string, myFunction>();
    #region Singleton
    private static readonly MyFunctions _functionInstance = new MyFunctions();
    static MyFunctions()
    {

    }
    private MyFunctions()
    {
        funcRouter.Add("Test2", Test2);
    }
    public static MyFunctions functionInstance
    {
        get
        {
            return _functionInstance;
        }
    }
    #endregion

    #region Definition and implementation of all the functions
    public int Test2(object o)
    {
        System.Diagnostics.Debug.WriteLine("Testing 2, object received {0}", (int)o);
        return 112;
    }
    #endregion

    public myFunction Get(string s)
    {
        return (myFunction)funcRouter[s];
    }

}

MyStates类定义如下:

public delegate int myFunction(object o);
public class MyState
{
    private int _ID;
    private myFunction _func;

    public myFunction func
    {
        get { return _func; }
    }
    public int ID
    {
        get { return _ID; }
    }
    public MyState(int myID, myFunction f = null)
    {
        _ID = myID;
        _func = f;
    }

}

我的主要计划:

public delegate int myFunction(object o);
class Program
{

    static void Main(string[] args)
    {
        myFunction f = null;
        //f = MyFunctions.functionInstance.Test2;
        f = MyFunctions.functionInstance.Get("Test2");
        MyState s = new MyState(123,f);
        Console.ReadLine();
    }
}

注意:上面的代码将生成编译错误。但是,如果我使用语句

f = MyFunctions.functionInstance.Test2;

程序编译正常并正确执行。我认为问题在于使用字典来检索函数的地址。有可能在C ++中做到这一点,我认为C#应该允许我做同样的事情。我只是没有正确地做到这一点。

请告知。

1 个答案:

答案 0 :(得分:2)

您在两个地方定义public delegate int myFunction(object o);。编译器错误错误表示您无法将一个转换为另一个。这是因为在f = MyFunctions.functionInstance.Get("Test2");的情况下,您将一种类型的返回值赋给不同类型的变量,但使用f = MyFunctions.functionInstance.Test2;时,编译器只查找与该委托匹配的方法签名。 / p>

一种解决方法是将f声明为MyDelegates.MyFunctions.myFunction

MyDelegates.MyFunctions.myFunction f;
f = MyDelegates.MyFunctions.functionInstance.Get("Test2");

另一种方法是将它包装在本地委托中(因为这样再次使用签名匹配):

myFunction f;
f = new myFunction(MyDelegates.MyFunctions.functionInstance.Get("Test2"));

同样适用于在MyState中使用它 - 稍后调用。

解决此问题的另一种方法是在任何地方使用Func<object, int>而不是myFunction委托。