不能隐式转换类型
本文关键字:类型 转换 不能 | 更新日期: 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
委托。