C# 有没有办法施展Func<;v1、v2、out1>;to Func<;out1>;假设我知道v1和v2?
所以我有一个函数,它接受一个没有参数的函数:C# 有没有办法施展Func<;v1、v2、out1>;to Func<;out1>;假设我知道v1和v2?,c#,events,lambda,casting,delegates,C#,Events,Lambda,Casting,Delegates,所以我有一个函数,它接受一个没有参数的函数: public static bool RetryUntilSuccessOrTimeout(Func<bool> task, TimeSpan timeSpan) { bool success = false; int elapsed = 0; while ((!success) && (elapsed < timeSpan.TotalMilliseconds)
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;
}
我有一个函数,它采用了与这三个函数相同的aruments。所以我提供了这些信息。有没有一种方法可以将这些函数作为不带任何参数的函数传递(因为我提供了它们),这样我就可以将其传递到retryuntillsuccessortimeout()的“任务”中
问题的封装图像:
是的。基本上你就是这么做的
() => func(a, b)
您需要的是“部分函数应用程序”。C#没有像某些语言(F#、Haskell)那样的语言级支持,但在某些情况下使用lambda表达式是有效的。@stt106不,它不是。正如前面的评论中提到的,它是部分函数应用程序。如果使用这个函数,那就是使用一个
Func
并创建一个Func
。当我看到像这样调用任何一个Func时,我内心都在畏缩。在您的情况下,如果func为null,则可能需要引发异常。我习惯于通过task?.Invoke()调用它们??当可能出现违约时,为true。否则,就地/上游处理空参考。
() => func(a, b)