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.