从委托转换为函数
Cast from a delegate to a func
我在学校有一个项目,我的老师要求我们将委托添加到函数列表中。我下面的代码在 AddDel 方法中有问题。 Intellisense 告诉我它不能从 Delegate 转换成 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}";
}
}
基本上,您根本不应该在这里声明您自己的委托。像这样的委托类型之间没有转换。
你想要一个 Func<int, double, char, string, string>
,所以声明一个:
Func<int, double, char, string, string> func = MyFunction;
_DList.Add(func);
或者更简单地说,只需调用 Add:
_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
...但我实际上并没有从中看到任何好处。
我在学校有一个项目,我的老师要求我们将委托添加到函数列表中。我下面的代码在 AddDel 方法中有问题。 Intellisense 告诉我它不能从 Delegate 转换成 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}";
}
}
基本上,您根本不应该在这里声明您自己的委托。像这样的委托类型之间没有转换。
你想要一个 Func<int, double, char, string, string>
,所以声明一个:
Func<int, double, char, string, string> func = MyFunction;
_DList.Add(func);
或者更简单地说,只需调用 Add:
_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
...但我实际上并没有从中看到任何好处。