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