我在学校有一个项目,我的老师要求我们将一个代表添加到Funcs列表中。我下面的代码在AddDel方法中存在问题。 Intellisense告诉我,它不能从代表转换为Func,但我的老师坚持认为它应该完全没有问题。我究竟做错了什么?
public class TestDelegate
{
private delegate string MyDel(int iVal, double dVal, char cVal, string sVal);
private List<Func<int, double, char, string, string>> _DList;
public TestDelegate() { }
public void AddDel()
{
//Creating a delegate
MyDel myDel = new MyDel(MyFunction);
_DList.Add(myDel); //Adding it to the TestDelegate
}
public void RunTests()
{
int idata = 1;
double ddata = 5.1;
char cdata = 'A';
string sdata = "Method";
foreach (Func<int, double, char, string, string> myDel in _DList)
WriteLine(myDel(idata, ddata++, cdata++, sdata + idata++));
}
private static string MyFunction(int iVal, double dVal, char cVal, string sVal)
{
return $"{sVal}:\t{iVal} {dVal}{cVal}";
}
}
答案 0 :(得分:2)
基本上,你根本不应该在这里声明你自己的代表。这样的委托类型之间没有转换。
你想要一个Func<int, double, char, string, string>
,所以声明一个:
Func<int, double, char, string, string> func = MyFunction;
_DList.Add(func);
或者更简单地说,只需调用添加:
_DList.Add(MyFunction);
如果您真的想保留当前的代码,可以创建包装您的代理人的Func<...>
:
MyDel myDel = new MyDel(MyFunction);
var func = new Func<int, double, char, string, string>(myDel);
_DList.Add(func); //Adding it to the TestDelegate
......但我实际上并没有从中看到任何好处。