我有一个IEnumerable接口的扩展方法,它接受类型Func<T, bool?>
的委托作为参数:
public static bool? ForEach<T>(this IEnumerable<T> source, Func<T, bool?> func)
{
bool? commandSuccessful = true;
foreach (var element in source)
{
var rv = func(element);
if (rv == null)
{
return null;
}
if (rv == false)
{
commandSuccessful = false;
}
}
return commandSuccessful;
}
但是当func的签名为Func <T, RuntimeDetails, bool?>
时,仍然可以使用相同的扩展方法:
RuntimeDetails lastRuntimeDetails = null;
var startCommandSuccessful =
activeConfiguration.Applications.ForEach(
_ => PrepareRuntimeDetailsAndDownload( _ , ref lastRuntimeDetails));
private bool? PrepareRuntimeDetailsAndDownload(Application configurationApplication,
ref RuntimeDetails lastRuntimeDetails)
{...}
我同时感到困惑和快乐。它为什么有效?如果它没有工作,我不知道如何编写扩展名,因为RuntimeDetails
参数在扩展方法中是未知的。
答案 0 :(得分:6)
你的假设是错误的
_ => PrepareRuntimDetailsAndDownload(...)
不是一个Func<T, RunTimeDetails, bool?>
!它是一个Func<T, bool?>
,它需要一个T
类型的参数并返回bool?
。您没有传递lastRuntimeDetails
作为参数。它只是closure。
答案 1 :(得分:3)
lambda _ => PrepareRuntimeDetailsAndDownload( _ , ref lastRuntimeDetails)
接受_
类型的一个参数(T
)并生成类型为bool?
的结果。因此,它的类型为Func<T, bool?>
,而不是Func<T, RuntimeDetails, bool?>
。