从委托转变为func

时间:2016-06-17 20:30:03

标签: c# delegates func

我在学校有一个项目,我的老师要求我们将一个代表添加到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}";
    }
}

1 个答案:

答案 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

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