Func 委托意外工作
Func delegate working unexpectedly
我有一个 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
参数在扩展方法中是未知的。
lambda _ => PrepareRuntimeDetailsAndDownload( _ , ref lastRuntimeDetails)
接受一个 T
类型的参数 (_
) 并产生 bool?
类型的结果。因此它的类型是 Func<T, bool?>
,而不是 Func<T, RuntimeDetails, bool?>
.
你的假设是错误的
_ => PrepareRuntimDetailsAndDownload(...)
不是一个Func<T, RunTimeDetails, bool?>
!它是一个Func<T, bool?>
,它接受一个T
和returns一个bool?
类型的参数。您没有将 lastRuntimeDetails
作为参数传递。只是一个closure.
我有一个 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
参数在扩展方法中是未知的。
lambda _ => PrepareRuntimeDetailsAndDownload( _ , ref lastRuntimeDetails)
接受一个 T
类型的参数 (_
) 并产生 bool?
类型的结果。因此它的类型是 Func<T, bool?>
,而不是 Func<T, RuntimeDetails, bool?>
.
你的假设是错误的
_ => PrepareRuntimDetailsAndDownload(...)
不是一个Func<T, RunTimeDetails, bool?>
!它是一个Func<T, bool?>
,它接受一个T
和returns一个bool?
类型的参数。您没有将 lastRuntimeDetails
作为参数传递。只是一个closure.