从委托转换为函数

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

...但我实际上并没有从中看到任何好处。