* generic.cs (DropGenericTypeArguments): New. Captures the common
[mono.git] / mcs / gmcs / generic.cs
index 08ab140e33e7dfa00fbb6e37e8ef8370aaf75bc6..e938019b20b78863e1daec5f84f8718d9579ede7 100644 (file)
@@ -463,18 +463,6 @@ namespace Mono.CSharp {
                        return true;
                }
 
-               /// <summary>
-               ///   Set the attributes on the GenericTypeParameterBuilder.
-               /// </summary>
-               /// <remarks>
-               ///   This is not done in Resolve() since Resolve() may be called before
-               ///   the GenericTypeParameterBuilder is created (partial generic classes).
-               /// </remarks>
-               public void Define (GenericTypeParameterBuilder type)
-               {
-                       type.SetGenericParameterAttributes (attrs);
-               }
-
                public override GenericParameterAttributes Attributes {
                        get { return attrs; }
                }
@@ -566,8 +554,8 @@ namespace Mono.CSharp {
                GenericTypeParameterBuilder type;
 
                public TypeParameter (TypeContainer parent, DeclSpace decl, string name,
-                                     Constraints constraints, Location loc)
-                       : base (parent, new MemberName (name, loc), null)
+                                     Constraints constraints, Attributes attrs, Location loc)
+                       : base (parent, new MemberName (name, loc), attrs)
                {
                        this.name = name;
                        this.decl = decl;
@@ -653,23 +641,6 @@ namespace Mono.CSharp {
 
                /// <summary>
                ///   This is the third method which is called during the resolving
-               ///   process.  We're called immediately after calling Resolve() on
-               ///   all of the current class'es type parameters.
-               ///
-               ///   All we do is setting the attributes on the GenericTypeParameterBuilder.
-               /// </summary>
-               /// <remarks>
-               ///   This is not done in Resolve() since Resolve() may be called before
-               ///   Define() for partial generic classes.
-               /// </remarks>
-               public void DefineConstraints ()
-               {
-                       if (constraints != null)
-                               constraints.Define (type);
-               }
-
-               /// <summary>
-               ///   This is the forth method which is called during the resolving
                ///   process.  We're called immediately after calling DefineConstraints()
                ///   on all of the current class'es type parameters.
                ///
@@ -691,7 +662,7 @@ namespace Mono.CSharp {
                }
 
                /// <summary>
-               ///   This is the fith and last method which is called during the resolving
+               ///   This is the fourth and last method which is called during the resolving
                ///   process.  We're called after everything is fully resolved and actually
                ///   register the constraints with SRE and the TypeManager.
                /// </summary>
@@ -729,9 +700,8 @@ namespace Mono.CSharp {
                                        mb = mb.GetGenericMethodDefinition ();
 
                                int pos = type.GenericParameterPosition;
-                               ParameterData pd = TypeManager.GetParameterData (mb);
-                               GenericConstraints temp_gc = pd.GenericConstraints (pos);
                                Type mparam = mb.GetGenericArguments () [pos];
+                               GenericConstraints temp_gc = ReflectionConstraints.GetConstraints (mparam);
 
                                if (temp_gc != null)
                                        gc = new InflatedConstraints (temp_gc, implementing.DeclaringType);
@@ -781,6 +751,7 @@ namespace Mono.CSharp {
                                type.SetBaseTypeConstraint (gc.ClassConstraint);
 
                        type.SetInterfaceConstraints (gc.InterfaceConstraints);
+                       type.SetGenericParameterAttributes (gc.Attributes);
                        TypeManager.RegisterBuilder (type, gc.InterfaceConstraints);
 
                        return true;
@@ -830,6 +801,12 @@ namespace Mono.CSharp {
                        return constraints.CheckInterfaceMethod (ec, new_constraints);
                }
 
+               public void EmitAttributes (EmitContext ec)
+               {
+                       if (OptAttributes != null)
+                               OptAttributes.Emit (ec, this);
+               }
+
                public override string DocCommentHeader {
                        get {
                                throw new InvalidOperationException (
@@ -848,17 +825,19 @@ namespace Mono.CSharp {
 
                public override void ApplyAttributeBuilder (Attribute a,
                                                            CustomAttributeBuilder cb)
-               { }
+               {
+                       type.SetCustomAttribute (cb);
+               }
 
                public override AttributeTargets AttributeTargets {
                        get {
-                               return (AttributeTargets) 0;
+                               return (AttributeTargets) AttributeTargets.GenericParameter;
                        }
                }
 
                public override string[] ValidAttributeTargets {
                        get {
-                               return new string [0];
+                               return new string [] { "type parameter" };
                        }
                }
 
@@ -1126,13 +1105,18 @@ namespace Mono.CSharp {
                ///   parser creates a `MemberName' with `TypeArguments' for both cases and
                ///   in case of a generic type definition, we call GetDeclarations().
                /// </summary>
-               public string[] GetDeclarations ()
+               public TypeParameterName[] GetDeclarations ()
                {
-                       string[] ret = new string [args.Count];
+                       TypeParameterName[] ret = new TypeParameterName [args.Count];
                        for (int i = 0; i < args.Count; i++) {
+                               TypeParameterName name = args [i] as TypeParameterName;
+                               if (name != null) {
+                                       ret [i] = name;
+                                       continue;
+                               }
                                SimpleName sn = args [i] as SimpleName;
                                if (sn != null) {
-                                       ret [i] = sn.Name;
+                                       ret [i] = new TypeParameterName (sn.Name, null, sn.Location);
                                        continue;
                                }
 
@@ -1214,6 +1198,10 @@ namespace Mono.CSharp {
                                        Report.Error (306, Location, "The type `{0}' may not be used " +
                                                      "as a type argument.", TypeManager.CSharpName (te.Type));
                                        return false;
+                               } else if (te.Type == TypeManager.void_type) {
+                                       Report.Error (1547, Location,
+                                                     "Keyword `void' cannot be used in this context");
+                                       return false;
                                }
 
                                atypes [i] = te.Type;
@@ -1222,6 +1210,23 @@ namespace Mono.CSharp {
                }
        }
 
+       public class TypeParameterName : SimpleName
+       {
+               Attributes attributes;
+
+               public TypeParameterName (string name, Attributes attrs, Location loc)
+                       : base (name, loc)
+               {
+                       attributes = attrs;
+               }
+
+               public Attributes OptAttributes {
+                       get {
+                               return attributes;
+                       }
+               }
+       }
+
        /// <summary>
        ///   An instantiation of a generic type.
        /// </summary>  
@@ -1299,31 +1304,169 @@ namespace Mono.CSharp {
                        return TypeManager.CSharpName (gt);
                }
 
-               protected bool CheckConstraint (EmitContext ec, Type ptype, Expression expr,
-                                               Type ctype)
+               protected override TypeExpr DoResolveAsTypeStep (EmitContext ec)
                {
-                       if (TypeManager.HasGenericArguments (ctype)) {
-                               Type[] types = TypeManager.GetTypeArguments (ctype);
+                       if (!ResolveConstructedType (ec))
+                               return null;
 
-                               TypeArguments new_args = new TypeArguments (loc);
+                       return this;
+               }
 
-                               for (int i = 0; i < types.Length; i++) {
-                                       Type t = types [i];
+               /// <summary>
+               ///   Check the constraints; we're called from ResolveAsTypeTerminal()
+               ///   after fully resolving the constructed type.
+               /// </summary>
+               public bool CheckConstraints (EmitContext ec)
+               {
+                       return ConstraintChecker.CheckConstraints (ec, gt, gen_params, atypes, loc);
+               }
 
-                                       if (t.IsGenericParameter) {
-                                               int pos = t.GenericParameterPosition;
-                                               t = args.Arguments [pos];
-                                       }
-                                       new_args.Add (new TypeExpression (t, loc));
-                               }
+               /// <summary>
+               ///   Resolve the constructed type, but don't check the constraints.
+               /// </summary>
+               public bool ResolveConstructedType (EmitContext ec)
+               {
+                       if (type != null)
+                               return true;
+                       // If we already know the fully resolved generic type.
+                       if (gt != null)
+                               return DoResolveType (ec);
 
-                               TypeExpr ct = new ConstructedType (ctype, new_args, loc);
-                               if (ct.ResolveAsTypeStep (ec) == null)
+                       int num_args;
+                       Type t = name.Type;
+
+                       if (t == null) {
+                               Report.Error (246, loc, "Cannot find type `{0}'<...>", Name);
+                               return false;
+                       }
+
+                       num_args = TypeManager.GetNumberOfTypeArguments (t);
+                       if (num_args == 0) {
+                               Report.Error (308, loc,
+                                             "The non-generic type `{0}' cannot " +
+                                             "be used with type arguments.",
+                                             TypeManager.CSharpName (t));
+                               return false;
+                       }
+
+                       gt = t.GetGenericTypeDefinition ();
+                       return DoResolveType (ec);
+               }
+
+               bool DoResolveType (EmitContext ec)
+               {
+                       //
+                       // Resolve the arguments.
+                       //
+                       if (args.Resolve (ec) == false)
+                               return false;
+
+                       gen_params = gt.GetGenericArguments ();
+                       atypes = args.Arguments;
+
+                       if (atypes.Length != gen_params.Length) {
+                               Report.Error (305, loc,
+                                             "Using the generic type `{0}' " +
+                                             "requires {1} type arguments",
+                                             TypeManager.CSharpName (gt),
+                                             gen_params.Length.ToString ());
+                               return false;
+                       }
+
+                       //
+                       // Now bind the parameters.
+                       //
+                       type = gt.MakeGenericType (atypes);
+                       return true;
+               }
+
+               public Expression GetSimpleName (EmitContext ec)
+               {
+                       return this;
+               }
+
+               public override bool CheckAccessLevel (DeclSpace ds)
+               {
+                       return ds.CheckAccessLevel (gt);
+               }
+
+               public override bool AsAccessible (DeclSpace ds, int flags)
+               {
+                       return ds.AsAccessible (gt, flags);
+               }
+
+               public override bool IsClass {
+                       get { return gt.IsClass; }
+               }
+
+               public override bool IsValueType {
+                       get { return gt.IsValueType; }
+               }
+
+               public override bool IsInterface {
+                       get { return gt.IsInterface; }
+               }
+
+               public override bool IsSealed {
+                       get { return gt.IsSealed; }
+               }
+
+               public override bool Equals (object obj)
+               {
+                       ConstructedType cobj = obj as ConstructedType;
+                       if (cobj == null)
+                               return false;
+
+                       if ((type == null) || (cobj.type == null))
+                               return false;
+
+                       return type == cobj.type;
+               }
+
+               public override int GetHashCode ()
+               {
+                       return base.GetHashCode ();
+               }
+
+               public override string Name {
+                       get {
+                               return full_name;
+                       }
+               }
+
+
+               public override string FullName {
+                       get {
+                               return full_name;
+                       }
+               }
+       }
+
+       public abstract class ConstraintChecker
+       {
+               protected readonly Type[] gen_params;
+               protected readonly Type[] atypes;
+               protected readonly Location loc;
+
+               protected ConstraintChecker (Type[] gen_params, Type[] atypes, Location loc)
+               {
+                       this.gen_params = gen_params;
+                       this.atypes = atypes;
+                       this.loc = loc;
+               }
+
+               /// <summary>
+               ///   Check the constraints; we're called from ResolveAsTypeTerminal()
+               ///   after fully resolving the constructed type.
+               /// </summary>
+               public bool CheckConstraints (EmitContext ec)
+               {
+                       for (int i = 0; i < gen_params.Length; i++) {
+                               if (!CheckConstraints (ec, i))
                                        return false;
-                               ctype = ct.Type;
                        }
 
-                       return Convert.ImplicitStandardConversionExists (ec, expr, ctype);
+                       return true;
                }
 
                protected bool CheckConstraints (EmitContext ec, int index)
@@ -1416,7 +1559,7 @@ namespace Mono.CSharp {
                        if (HasDefaultConstructor (ec, atype))
                                return true;
 
-                       Report.SymbolRelatedToPreviousError (gt);
+                       Report_SymbolRelatedToPreviousError ();
                        Report.SymbolRelatedToPreviousError (atype);
                        Report.Error (310, loc, "The type `{0}' must have a public " +
                                      "parameterless constructor in order to use it " +
@@ -1428,14 +1571,31 @@ namespace Mono.CSharp {
                        return false;
                }
 
-               void Error_TypeMustBeConvertible (Type atype, Type gc, Type ptype)
+               protected bool CheckConstraint (EmitContext ec, Type ptype, Expression expr,
+                                               Type ctype)
                {
-                       Report.SymbolRelatedToPreviousError (gt);
-                       Report.SymbolRelatedToPreviousError (atype);
-                       Report.Error (309, loc, "The type `{0}' must be convertible to `{1}' in order to " +
-                                         "use it as parameter `{2}' in the generic type or method `{3}'",
-                                         TypeManager.CSharpName (atype), TypeManager.CSharpName (gc),
-                                         TypeManager.CSharpName (ptype), GetSignatureForError ());
+                       if (TypeManager.HasGenericArguments (ctype)) {
+                               Type[] types = TypeManager.GetTypeArguments (ctype);
+
+                               TypeArguments new_args = new TypeArguments (loc);
+
+                               for (int i = 0; i < types.Length; i++) {
+                                       Type t = types [i];
+
+                                       if (t.IsGenericParameter) {
+                                               int pos = t.GenericParameterPosition;
+                                               t = atypes [pos];
+                                       }
+                                       new_args.Add (new TypeExpression (t, loc));
+                               }
+
+                               TypeExpr ct = new ConstructedType (ctype, new_args, loc);
+                               if (ct.ResolveAsTypeStep (ec) == null)
+                                       return false;
+                               ctype = ct.Type;
+                       }
+
+                       return Convert.ImplicitStandardConversionExists (ec, expr, ctype);
                }
 
                bool HasDefaultConstructor (EmitContext ec, Type atype)
@@ -1451,8 +1611,7 @@ namespace Mono.CSharp {
                                        if ((c.Parameters.FixedParameters != null) &&
                                            (c.Parameters.FixedParameters.Length != 0))
                                                continue;
-                                       if (c.Parameters.HasArglist ||
-                                           (c.Parameters.ArrayParameter != null))
+                                       if (c.Parameters.HasArglist || c.Parameters.HasParams)
                                                continue;
 
                                        return true;
@@ -1476,145 +1635,80 @@ namespace Mono.CSharp {
                        return false;
                }
 
-               protected override TypeExpr DoResolveAsTypeStep (EmitContext ec)
-               {
-                       if (!ResolveConstructedType (ec))
-                               return null;
-
-                       return this;
-               }
-
-               /// <summary>
-               ///   Check the constraints; we're called from ResolveAsTypeTerminal()
-               ///   after fully resolving the constructed type.
-               /// </summary>
-               public bool CheckConstraints (EmitContext ec)
-               {
-                       for (int i = 0; i < gen_params.Length; i++) {
-                               if (!CheckConstraints (ec, i))
-                                       return false;
-                       }
-
-                       return true;
-               }
+               protected abstract string GetSignatureForError ();
+               protected abstract void Report_SymbolRelatedToPreviousError ();
 
-               /// <summary>
-               ///   Resolve the constructed type, but don't check the constraints.
-               /// </summary>
-               public bool ResolveConstructedType (EmitContext ec)
+               void Error_TypeMustBeConvertible (Type atype, Type gc, Type ptype)
                {
-                       if (type != null)
-                               return true;
-                       // If we already know the fully resolved generic type.
-                       if (gt != null)
-                               return DoResolveType (ec);
-
-                       int num_args;
-                       Type t = name.Type;
-
-                       if (t == null) {
-                               Report.Error (246, loc, "Cannot find type `{0}'<...>", Name);
-                               return false;
-                       }
-
-                       num_args = TypeManager.GetNumberOfTypeArguments (t);
-                       if (num_args == 0) {
-                               Report.Error (308, loc,
-                                             "The non-generic type `{0}' cannot " +
-                                             "be used with type arguments.",
-                                             TypeManager.CSharpName (t));
-                               return false;
-                       }
-
-                       gt = t.GetGenericTypeDefinition ();
-                       return DoResolveType (ec);
+                       Report_SymbolRelatedToPreviousError ();
+                       Report.SymbolRelatedToPreviousError (atype);
+                       Report.Error (309, loc, 
+                                     "The type `{0}' must be convertible to `{1}' in order to " +
+                                     "use it as parameter `{2}' in the generic type or method `{3}'",
+                                     TypeManager.CSharpName (atype), TypeManager.CSharpName (gc),
+                                     TypeManager.CSharpName (ptype), GetSignatureForError ());
                }
 
-               bool DoResolveType (EmitContext ec)
+               public static bool CheckConstraints (EmitContext ec, MethodBase definition,
+                                                    MethodBase instantiated, Location loc)
                {
-                       //
-                       // Resolve the arguments.
-                       //
-                       if (args.Resolve (ec) == false)
-                               return false;
-
-                       gen_params = gt.GetGenericArguments ();
-                       atypes = args.Arguments;
+                       MethodConstraintChecker checker = new MethodConstraintChecker (
+                               definition, definition.GetGenericArguments (),
+                               instantiated.GetGenericArguments (), loc);
 
-                       if (atypes.Length != gen_params.Length) {
-                               Report.Error (305, loc,
-                                             "Using the generic type `{0}' " +
-                                             "requires {1} type arguments",
-                                             TypeManager.CSharpName (gt),
-                                             gen_params.Length.ToString ());
-                               return false;
-                       }
-
-                       //
-                       // Now bind the parameters.
-                       //
-                       type = gt.MakeGenericType (atypes);
-                       return true;
+                       return checker.CheckConstraints (ec);
                }
 
-               public Expression GetSimpleName (EmitContext ec)
+               public static bool CheckConstraints (EmitContext ec, Type gt, Type[] gen_params,
+                                                    Type[] atypes, Location loc)
                {
-                       return this;
-               }
+                       TypeConstraintChecker checker = new TypeConstraintChecker (
+                               gt, gen_params, atypes, loc);
 
-               public override bool CheckAccessLevel (DeclSpace ds)
-               {
-                       return ds.CheckAccessLevel (gt);
+                       return checker.CheckConstraints (ec);
                }
 
-               public override bool AsAccessible (DeclSpace ds, int flags)
+               protected class MethodConstraintChecker : ConstraintChecker
                {
-                       return ds.AsAccessible (gt, flags);
-               }
-
-               public override bool IsClass {
-                       get { return gt.IsClass; }
-               }
+                       MethodBase definition;
 
-               public override bool IsValueType {
-                       get { return gt.IsValueType; }
-               }
-
-               public override bool IsInterface {
-                       get { return gt.IsInterface; }
-               }
-
-               public override bool IsSealed {
-                       get { return gt.IsSealed; }
-               }
-
-               public override bool Equals (object obj)
-               {
-                       ConstructedType cobj = obj as ConstructedType;
-                       if (cobj == null)
-                               return false;
+                       public MethodConstraintChecker (MethodBase definition, Type[] gen_params,
+                                                       Type[] atypes, Location loc)
+                               : base (gen_params, atypes, loc)
+                       {
+                               this.definition = definition;
+                       }
 
-                       if ((type == null) || (cobj.type == null))
-                               return false;
+                       protected override string GetSignatureForError ()
+                       {
+                               return TypeManager.CSharpSignature (definition);
+                       }
 
-                       return type == cobj.type;
+                       protected override void Report_SymbolRelatedToPreviousError ()
+                       {
+                               Report.SymbolRelatedToPreviousError (definition);
+                       }
                }
 
-               public override int GetHashCode ()
+               protected class TypeConstraintChecker : ConstraintChecker
                {
-                       return base.GetHashCode ();
-               }
+                       Type gt;
 
-               public override string Name {
-                       get {
-                               return full_name;
+                       public TypeConstraintChecker (Type gt, Type[] gen_params, Type[] atypes,
+                                                     Location loc)
+                               : base (gen_params, atypes, loc)
+                       {
+                               this.gt = gt;
                        }
-               }
 
+                       protected override string GetSignatureForError ()
+                       {
+                               return TypeManager.CSharpName (gt);
+                       }
 
-               public override string FullName {
-                       get {
-                               return full_name;
+                       protected override void Report_SymbolRelatedToPreviousError ()
+                       {
+                               Report.SymbolRelatedToPreviousError (gt);
                        }
                }
        }
@@ -1658,8 +1752,11 @@ namespace Mono.CSharp {
                public bool Define (MethodBuilder mb)
                {
                        GenericTypeParameterBuilder[] gen_params;
-                       string[] names = MemberName.TypeArguments.GetDeclarations ();
-                       gen_params = mb.DefineGenericParameters (names);
+                       TypeParameterName[] names = MemberName.TypeArguments.GetDeclarations ();
+                       string[] snames = new string [names.Length];
+                       for (int i = 0; i < names.Length; i++)
+                               snames [i] = names [i].Name;
+                       gen_params = mb.DefineGenericParameters (snames);
                        for (int i = 0; i < TypeParameters.Length; i++)
                                TypeParameters [i].Define (gen_params [i]);
 
@@ -1671,9 +1768,6 @@ namespace Mono.CSharp {
                                        return false;
                        }
 
-                       for (int i = 0; i < TypeParameters.Length; i++)
-                               TypeParameters [i].DefineConstraints ();
-
                        return true;
                }
 
@@ -1689,14 +1783,8 @@ namespace Mono.CSharp {
                                        return false;
 
                        bool ok = true;
-                       if (parameters.FixedParameters != null) {
-                               foreach (Parameter p in parameters.FixedParameters){
-                                       if (!p.Resolve (ec))
-                                               ok = false;
-                               }
-                       }
-                       if (parameters.ArrayParameter != null) {
-                               if (!parameters.ArrayParameter.Resolve (ec))
+                       foreach (Parameter p in parameters.FixedParameters){
+                               if (!p.Resolve (ec))
                                        ok = false;
                        }
                        if ((return_type != null) && (return_type.ResolveAsTypeTerminal (ec) == null))
@@ -1705,6 +1793,15 @@ namespace Mono.CSharp {
                        return ok;
                }
 
+               public void EmitAttributes (EmitContext ec)
+               {
+                       for (int i = 0; i < TypeParameters.Length; i++)
+                               TypeParameters [i].EmitAttributes (ec);
+
+                       if (OptAttributes != null)
+                               OptAttributes.Emit (ec, this);
+               }
+
                public override bool DefineMembers (TypeContainer parent)
                {
                        return true;
@@ -1724,7 +1821,7 @@ namespace Mono.CSharp {
 
                public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb)
                {
-                       // FIXME
+                       base.ApplyAttributeBuilder (a, cb);
                }
 
                public override AttributeTargets AttributeTargets {
@@ -1870,9 +1967,7 @@ namespace Mono.CSharp {
 
                public static TypeContainer LookupGenericTypeContainer (Type t)
                {
-                       while (t.IsGenericInstance)
-                               t = t.GetGenericTypeDefinition ();
-
+                       t = DropGenericTypeArguments (t);
                        return LookupTypeContainer (t);
                }
 
@@ -1890,7 +1985,7 @@ namespace Mono.CSharp {
                        if (tparam != null)
                                return tparam.GenericConstraints;
 
-                       return new ReflectionConstraints (t);
+                       return ReflectionConstraints.GetConstraints (t);
                }
 
                public static bool IsGeneric (Type t)
@@ -1936,6 +2031,16 @@ namespace Mono.CSharp {
                                return t.GetGenericArguments ();
                }
 
+               public static Type DropGenericTypeArguments (Type t)
+               {
+                       if (!t.IsGenericType)
+                               return t;
+                       // Micro-optimization: a generic typebuilder is always a generic type definition
+                       if (t is TypeBuilder)
+                               return t;
+                       return t.GetGenericTypeDefinition ();
+               }
+
                //
                // Whether `array' is an array of T and `enumerator' is `IEnumerable<T>'.
                // For instance "string[]" -> "IEnumerable<string>".
@@ -2163,14 +2268,12 @@ namespace Mono.CSharp {
                        int tcount = GetNumberOfTypeArguments (type);
                        int pcount = GetNumberOfTypeArguments (parent);
 
-                       if (type.IsGenericInstance)
-                               type = type.GetGenericTypeDefinition ();
-                       if (parent.IsGenericInstance)
-                               parent = parent.GetGenericTypeDefinition ();
-
                        if (tcount != pcount)
                                return false;
 
+                       type = DropGenericTypeArguments (type);
+                       parent = DropGenericTypeArguments (parent);
+
                        return type.Equals (parent);
                }
 
@@ -2485,11 +2588,7 @@ namespace Mono.CSharp {
 
                public static bool IsNullableType (Type t)
                {
-                       if (!t.IsGenericInstance)
-                               return false;
-
-                       Type gt = t.GetGenericTypeDefinition ();
-                       return gt == generic_nullable_type;
+                       return generic_nullable_type == DropGenericTypeArguments (t);
                }
        }
 
@@ -2508,8 +2607,8 @@ namespace Mono.CSharp {
                                Type = type;
                                UnderlyingType = TypeManager.GetTypeArguments (type) [0];
 
-                               PropertyInfo has_value_pi = type.GetProperty ("HasValue");
-                               PropertyInfo value_pi = type.GetProperty ("Value");
+                               PropertyInfo has_value_pi = TypeManager.GetProperty (type, "HasValue");
+                               PropertyInfo value_pi = TypeManager.GetProperty (type, "Value");
 
                                HasValue = has_value_pi.GetGetMethod (false);
                                Value = value_pi.GetGetMethod (false);