public static AssignExpression Assign(AccessableExpression left, Expression right)
        {
            if (left == null)
            {
                throw new ArgumentNullException(nameof(left));
            }
            if (right == null)
            {
                throw new ArgumentNullException(nameof(right));
            }

            return(new AssignExpression(left, right));
        }
 public static BinaryExpression DivideAssign(AccessableExpression left, Expression right) =>
 new AssignExpression(ExpressionType.DivideAssign, left, Divide(left, right));
 public static BinaryExpression ModuloAssign(AccessableExpression left, Expression right) =>
 new AssignExpression(ExpressionType.ModuloAssign, left, Modulo(left, right));
 public static BinaryExpression SubtractAssign(AccessableExpression left, Expression right) =>
 new AssignExpression(ExpressionType.SubtractAssign, left, Subtract(left, right));
 public static BinaryExpression MultiplyAssign(AccessableExpression left, Expression right) =>
 new AssignExpression(ExpressionType.MultiplyAssign, left, Multiply(left, right));
 public static BinaryExpression AddAssign(AccessableExpression left, Expression right) =>
 new AssignExpression(ExpressionType.AddAssign, left, Add(left, right));
 public static UnaryExpression PostDecrement(AccessableExpression left) =>
 new AddAssignExpression(ExpressionType.PostDecrement, left, Constant(-1));
 internal AddAssignExpression(ExpressionType expressionType, AccessableExpression left, Expression value)
     : base(expressionType, left, null)
 {
     this.value = value;
 }
 internal AssignExpression(ExpressionType expressionType, AccessableExpression left, Expression right, bool isPre = false)
     : base(expressionType, left, right, null)
 {
     this.isPre = isPre;
 }
 internal AssignExpression(AccessableExpression left, Expression right)
     : this(ExpressionType.Assign, left, right)
 {
 }