c# - 从委托(delegate)转换为函数

标签 c# delegates func

我在学校有一个项目,我的老师要求我们将委托(delegate)添加到函数列表中。我下面的代码在 AddDel 方法中存在问题。智能感知告诉我它无法从 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}";
    }
}

最佳答案

基本上,您根本不应该在这里声明自己的委托(delegate)。像这样的委托(delegate)类型之间没有转换。

您想要 Func<int, double, char, string, string> ,因此声明一个:

Func<int, double, char, string, string> func = MyFunction;
_DList.Add(func);

或者更简单,只需调用 Add:

_DList.Add(MyFunction);

如果您确实想保留当前代码,可以创建 Func<...> 包裹你的委托(delegate):

MyDel myDel = new MyDel(MyFunction);
var func = new Func<int, double, char, string, string>(myDel);
_DList.Add(func); //Adding it to the TestDelegate

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

关于c# - 从委托(delegate)转换为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37889913/

相关文章:

c# - RegularExpressionAttribute 的正则表达式必须包含 "[S]"文本

iphone - 处理何时回调已释放的委托(delegate)?

c# - 用 Func 替换 MongoDB 查询中的 lambda 表达式

ios - 使用 CGFloat 变量调用 func

c# - Cast 接口(interface)和类对象

c# - 在虚方法的所有覆盖之后执行代码

c# - 有没有更好的方法来枚举 IEnumerable<char> 中的文本元素?

ios - 尝试创建协议(protocol),获取时找不到协议(protocol)声明

C# 委托(delegate)实例化与仅传递方法引用

c# - 将 Func<T, bool> 传递给 LINQ Where