Func委托意外地工作

时间:2016-03-30 14:01:48

标签: c# linq functional-programming extension-methods

我有一个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参数在扩展方法中是未知的。

2 个答案:

答案 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?>