不能隐式转换类型

本文关键字:类型 转换 不能 | 更新日期: 2023-09-27 18:33:52

当我尝试对委托进行一些测试时,我遇到了障碍。我的目标是创建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# 应该允许我做同样的事情。我只是没有做对。

请指教。

不能隐式转换类型

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

一种解决方法是将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委托。