public void Emit (EmitContext ec, MethodSpec method, Arguments Arguments, Location loc) { // Speed up the check by not doing it on not allowed targets if (method.ReturnType.Kind == MemberKind.Void && method.IsConditionallyExcluded (ec.MemberContext, loc)) return; EmitPredefined (ec, method, Arguments); }
protected override Expression DoResolve(ResolveContext ec) { constructor_method = Delegate.GetConstructor (ec.Compiler, ec.CurrentType, type); var invoke_method = Delegate.GetInvokeMethod (ec.Compiler, type); method_group.DelegateType = type; method_group.CustomErrorHandler = this; Arguments arguments = CreateDelegateMethodArguments (invoke_method.Parameters, loc); method_group = method_group.OverloadResolve (ec, ref arguments, false, loc); if (method_group == null) return null; delegate_method = (MethodSpec) method_group; if (TypeManager.IsNullableType (delegate_method.DeclaringType)) { ec.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 (ec, delegate_method, loc); ExtensionMethodGroupExpr emg = method_group as ExtensionMethodGroupExpr; if (emg != null) { delegate_instance_expression = emg.ExtensionExpression; TypeSpec e_type = delegate_instance_expression.Type; if (TypeManager.IsValueType (e_type)) { ec.Report.Error (1113, loc, "Extension method `{0}' of value type `{1}' cannot be used to create delegates", delegate_method.GetSignatureForError (), TypeManager.CSharpName (e_type)); } } TypeSpec rt = delegate_method.ReturnType; Expression ret_expr = new TypeExpression (rt, loc); if (!Delegate.IsTypeCovariant (ret_expr, invoke_method.ReturnType)) { Error_ConversionFailed (ec, delegate_method, ret_expr); } if (delegate_method.IsConditionallyExcluded (loc)) { ec.Report.SymbolRelatedToPreviousError (delegate_method); MethodOrOperator m = delegate_method.MemberDefinition as MethodOrOperator; if (m != null && m.IsPartialDefinition) { ec.Report.Error (762, loc, "Cannot create delegate from partial method declaration `{0}'", delegate_method.GetSignatureForError ()); } else { ec.Report.Error (1618, loc, "Cannot create delegate with `{0}' because it has a Conditional attribute", TypeManager.CSharpSignature (delegate_method)); } } DoResolveInstanceExpression (ec); eclass = ExprClass.Value; return this; }