【问题标题】:Is there a way to cast Func<v1,v2,out1> to Func<out1> given I know v1 and v2? [duplicate]鉴于我知道 v1 和 v2,有没有办法将 Func<v1,v2,out1> 转换为 Func<out1>? [复制]
【发布时间】:2018-01-10 16:01:33
【问题描述】:

所以我有这个函数,它接受一个没有参数的函数:

public static bool RetryUntilSuccessOrTimeout(Func<bool> task, TimeSpan timeSpan)
    {
        bool success = false;
        int elapsed = 0;
        while ((!success) && (elapsed < timeSpan.TotalMilliseconds))
        {
            Thread.Sleep(1000);
            elapsed += 1000;
            success = task();
        }
        return success;
    }

然后我有一堆函数,比如:

private static bool OnDeleted(object source, FileSystemEventArgs e){...}
private static bool OnChanged(object source, FileSystemEventArgs e){...}
private static bool OnCreated(object source, FileSystemEventArgs e){...}

我有一个函数采用与这三个相同的参数。所以我提供了这些信息。有没有办法将这些函数作为不带任何参数的函数传递(因为我提供了它们)所以我可以将它传递给 RetryUntilSuccessOrTimeout() 的“任务”?

问题的封装图:

OnDirEvent

【问题讨论】:

  • 当我看到任何这样调用的函数时,我内心都在畏缩。在您的情况下,它可以,当 func 为 null 时,您可能想要引发异常。我习惯性地用task?.Invoke() ?? true 来称呼这些,当一个合理的默认值在手时。否则在原地/上游处理 null ref。

标签: c# events lambda casting delegates


【解决方案1】:

是的。基本上你只是这样做

() => func(a, b)

【讨论】:

  • 你要的叫做“部分函数应用”。 C# 不像某些语言(F#、Haskell)那样提供语言级别的支持,但在某些情况下使用 lambda 表达式是可行的。
  • @stt106 不,不是。它是部分功能应用程序,正如前面的评论中提到的那样。柯里化该函数将采用Func&lt;object, FileSystemEventArgs, bool&gt; 并创建Func&lt;Object, Func&lt;FileSystemEventArgs, bool&gt;&gt;。
猜你喜欢
  • 2018-10-15
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多