+
+ public bool DefineParameter (EmitContext ec, MethodBuilder mb, ConstructorBuilder cb, int index, Location loc)
+ {
+ if (mb == null)
+ builder = cb.DefineParameter (index, Attributes, Name);
+ else
+ builder = mb.DefineParameter (index, Attributes, Name);
+
+ if (ParameterInitializer != null) {
+ if (ParameterInitializer is MemberAccess) {
+ MemberAccess ma = ParameterInitializer as MemberAccess;
+
+ ParameterInitializer = ma.Resolve(ec);
+ } else
+ ParameterInitializer = ParameterInitializer.Resolve (ec);
+
+ if (ParameterInitializer == null) {
+ Report.Error(-1, "Internal error - Non supported argument type in optional parameter");
+ return false;
+ }
+
+ if (parameter_type != ParameterInitializer.Type) {
+ Expression conv = Expression.ConvertImplicit (ec, ParameterInitializer, parameter_type, loc);
+ if (conv == null) {
+ Report.Error (30439, loc, "Constant expression '" + ParameterInitializer + "' not representable in type '" + parameter_type + "'");
+ return false;
+ }
+ ParameterInitializer = conv;
+ }
+
+ if (!(ParameterInitializer is Constant)) {
+ Report.Error (30059, loc, "Constant expression is required");
+ return false;
+ }
+
+ builder.SetConstant (((Constant) ParameterInitializer).GetValue());
+
+ }
+
+ if (OptAttributes != null)
+ OptAttributes.Emit (ec, this);
+ return true;
+ }