private Parameter[] TypedLambdaParameterList(AstParameterList parameterList, DelegateType dt) { var parameters = dt.Parameters; if (parameterList.Parameters.Count != parameters.Length) { Error(parameterList.Source, ErrorCode.E1593, "Delegate " + dt.Quote() + " does not take " + parameterList.Parameters.Count + " arguments"); return(new Parameter[0]); } Parameter[] result = new Parameter[parameters.Length]; for (var i = 0; i < parameters.Length; ++i) { var param = parameters[i]; var astParam = parameterList.Parameters[i]; var astParamType = astParam.OptionalType != null ? Compiler.NameResolver.GetType(Function.DeclaringType, astParam.OptionalType) : param.Type; if (!astParamType.Equals(param.Type) || param.Modifier != astParam.Modifier || astParam.OptionalValue != null) { Error(parameterList.Source, ErrorCode.E1661, "Cannot convert anonymous method block to delegate type " + dt.Quote() + " because the specified block's parameter types do not match the delegate parameter types"); } var attributes = Compiler.CompileAttributes(Function.DeclaringType, astParam.Attributes); result[i] = new Parameter( astParam.Name.Source, attributes, param.Modifier, param.Type, astParam.Name.Symbol, null); } return(result); }