private void ProcessClosureInMethodInvocation(GenericParameterInferrer inferrer, BlockExpression closure, ICallableType formalType) { var sig = formalType.GetSignature(); var replacer = new TypeReplacer(); var collector = new TypeCollector(delegate(IType t) { IGenericParameter gp = t as IGenericParameter; if (gp == null) return false; return gp.DeclaringEntity == inferrer.GenericMethod; }); collector.Visit(formalType); foreach (var typeParameter in collector.Matches) { var inferredType = inferrer.GetInferredType((IGenericParameter)typeParameter); if (inferredType != null) replacer.Replace(typeParameter, inferredType); } for (var i = 0; i < sig.Parameters.Length; i++) { var pd = closure.Parameters[i]; if (pd.Type != null) continue; pd.Type = CodeBuilder.CreateTypeReference(replacer.MapType(sig.Parameters[i].Type)); } ProcessClosureBody(closure); }