コード例 #1
0
ファイル: codegen.cs プロジェクト: KAW0/Alter-Native
		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);
		}
コード例 #2
0
ファイル: delegate.cs プロジェクト: speier/shake
        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;
        }