Exemplo n.º 1
0
        public override DynamicMetaObject FallbackBinaryOperation(DynamicMetaObject target, DynamicMetaObject arg, DynamicMetaObject errorSuggestion)
        {
            if (target.Value == null || arg.Value == null)
            {
                return(BinderHelper.NullErrorOnOperation(_name, this.ReturnType, target, arg));
            }

            try {
                if (target.LimitType == arg.LimitType)
                {
                    var type        = target.LimitType;
                    var leftExpr    = BinderHelper.Wrap(target.Expression, type);
                    var rightExpr   = BinderHelper.Wrap(arg.Expression, type);
                    var checkedExpr = OverflowCheckingCalc(leftExpr, rightExpr);
                    if (checkedExpr != null)
                    {
                        var bindings = BinderHelper.GetTypeRestriction(target, arg);
                        return(new DynamicMetaObject(checkedExpr, bindings));
                    }
                }
                Expression expr = Expression.MakeBinary(
                    this.Operation,
                    BinderHelper.Wrap(target.Expression, target.LimitType),
                    BinderHelper.Wrap(arg.Expression, arg.LimitType));
                return(new DynamicMetaObject(
                           BinderHelper.Wrap(expr, this.ReturnType),
                           BinderHelper.GetTypeRestriction(target, arg)));
            }
            catch (InvalidOperationException) {
                return(DefferentType(target, arg));
            }
        }