2008-11-06 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / mcs / delegate.cs
index 3eaa58e0a7fa2bef9fbea8962ce733735fdfde5a..7fa7f6da67398743b1ef1f724128c6aef50818fb 100644 (file)
@@ -674,20 +674,20 @@ namespace Mono.CSharp {
                                Argument.AType atype_modifier;
                                Type atype = pd.Types [i];
                                switch (pd.FixedParameters [i].ModFlags) {
-                                       case Parameter.Modifier.REF:
-                                               atype_modifier = Argument.AType.Ref;
-                                               //atype = atype.GetElementType ();
-                                               break;
-                                       case Parameter.Modifier.OUT:
-                                               atype_modifier = Argument.AType.Out;
-                                               //atype = atype.GetElementType ();
-                                               break;
-                                       case Parameter.Modifier.ARGLIST:
-                                               // __arglist is not valid
-                                               throw new InternalErrorException ("__arglist modifier");
-                                       default:
-                                               atype_modifier = Argument.AType.Expression;
-                                               break;
+                               case Parameter.Modifier.REF:
+                                       atype_modifier = Argument.AType.Ref;
+                                       //atype = atype.GetElementType ();
+                                       break;
+                               case Parameter.Modifier.OUT:
+                                       atype_modifier = Argument.AType.Out;
+                                       //atype = atype.GetElementType ();
+                                       break;
+                               case Parameter.Modifier.ARGLIST:
+                                       // __arglist is not valid
+                                       throw new InternalErrorException ("__arglist modifier");
+                               default:
+                                       atype_modifier = Argument.AType.Expression;
+                                       break;
                                }
                                delegate_arguments.Add (new Argument (new TypeExpression (atype, loc), atype_modifier));
                        }
@@ -727,6 +727,13 @@ namespace Mono.CSharp {
                                return null;
 
                        delegate_method = (MethodInfo) method_group;
+                       
+                       if (TypeManager.IsNullableType (delegate_method.DeclaringType)) {
+                               Report.Error (1728, loc, "Cannot create delegate from method `{0}' because it is a member of System.Nullable<T> type",
+                                       TypeManager.GetFullNameSignature (delegate_method));
+                               return null;
+                       }               
+                       
                        Invocation.IsSpecialMethodInvocation (delegate_method, loc);
 
                        ExtensionMethodGroupExpr emg = method_group as ExtensionMethodGroupExpr;
@@ -757,11 +764,6 @@ namespace Mono.CSharp {
                                }
                        }
 
-                       if (TypeManager.IsNullableType (delegate_method.DeclaringType)) {
-                               Report.Error (1728, loc, "Cannot create delegate from method `{0}' because it is a member of System.Nullable<T> type",
-                                       TypeManager.GetFullNameSignature (delegate_method));
-                       }
-
                        DoResolveInstanceExpression (ec);
                        eclass = ExprClass.Value;
                        return this;
@@ -797,9 +799,11 @@ namespace Mono.CSharp {
 
                        if (!delegate_method.DeclaringType.IsSealed && delegate_method.IsVirtual && !method_group.IsBase) {
                                ec.ig.Emit (OpCodes.Dup);
-                               ec.ig.Emit (OpCodes.Ldvirtftn, (MethodInfo) delegate_method);
-                       } else
-                               ec.ig.Emit (OpCodes.Ldftn, (MethodInfo) delegate_method);
+                               ec.ig.Emit (OpCodes.Ldvirtftn, delegate_method);
+                       } else {
+                               ec.ig.Emit (OpCodes.Ldftn, delegate_method);
+                       }
+
                        ec.ig.Emit (OpCodes.Newobj, constructor_method);
                }