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);
        }
Esempio n. 2
0
 public void WriteParameterList(AstParameterList a)
 {
     Write(a.Source);
     WriteParameters(a.Parameters);
 }