【问题标题】:How do you return a Func<Func<string, int>, int>你如何返回一个 Func<Func<string, int>, int>
【发布时间】:2017-02-22 10:34:05
【问题描述】:

我最近想出了如何从方法中返回方法/函数,例如:

public static Func<string, int> Parse() {
    return x => Int32.Parse(x);
}

纯粹出于好奇,我想知道我能走多远。是否有可能以某种方式返回Func&lt;Func&lt;string, int&gt;, int&gt;?

public static Func<Func<string, int>, int> PlusSomething(this Func<string, int> parser) {
    return x => x + parser; //Obviously doesn't work
}



我设法做的最接近的事情是

public static Func<string, int, int> PlusSomething(this Func<string, int> parser) {
    return (x, y) => parser(x) + y;
}

【问题讨论】:

  • 您有错误信息吗?为什么this 扩展方法前缀?
  • 有点不清楚您要达到的目标;你能解释一下想要的结果吗?
  • 虽然这个问题已经得到解答,但我试图让它更清楚一点:我希望它接受一个值并返回一个值,而不是一个接受一个值并返回一个值的方法返回一个函数(然后它会计算值)。这就是前 3 行代码的作用。然后我问自己是否有可能创建一个将函数作为参数并再次返回该函数(不进行任何计算)的方法,以及新方法实际上应该做的事情。

标签: c# function lambda


【解决方案1】:

由于不是很清楚你想要实现什么,我将做一些猜测工作。

Func&lt;Func&lt;string, int&gt;, int&gt; 是一个函数,它接受一个函数并返回一个 int。

一种可能性是您想要返回一个函数,该函数采用函数f,将其应用于字符串并返回一个int。在这种情况下,您必须在某处指定要应用函数f 的内容。当你生成函数时

public static Func<Func<string, int>, int> PlusSomething(string s) {
    return f => f(s);
}

当你应用函数时

public static Func<Func<string, int>, int, int> PlusSomething() {
    return f, s => f(s);
}

看你的第二个例子,在我看来(我可能错了)你实际上想要返回一个接受 int 并返回一个函数的函数。

public static Func<int, Func<string, int>> PlusSomething(Func<string, int> parser) {
    return x => (y => x + parser(y));
}

这将允许像

var gen = PlusSomething(parser);
var parsePlus4 = gen(4);
int x = parsePlus4("8"); // x == 12

【讨论】:

  • 非常感谢!我实际上一直在尝试重新提出我的问题,只是不知道如何。 return x =&gt; (y =&gt; x + parser(y)); 正是我想要的。
【解决方案2】:

如前所述回答问题 - 是的,可以使用具有如下所述签名的函数。

public static
Func<Func<string,int>,int>
PlusSomething(this Func<string, int> parser)
{
    return x => 1;
}

但是不清楚期望的结果是什么以及输入应该如何与期望的输出相关联;从语法上讲是可能的。

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多