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)); } }