【问题标题】:Unhandled InvalidOperationException when constructing expression trees构造表达式树时出现未处理的 InvalidOperationException
【发布时间】:2020-01-26 03:11:01
【问题描述】:

我一直在尝试构建一个表达式树来评估 RPN 中的数学表达式。

尝试调用 MakeBinary 表达式来计算树中的数字时出现异常。

例外情况是以下“System.InvalidOperationException: '二元运算符 Add 没有为类型 'System.Char' 和 'System.Char' 定义。'”

这是我的代码:

  public static bool isOp(char checkIt)
    {
        bool verify;
        if(checkIt== '+'|| checkIt== '-'||checkIt== '*' || checkIt== '/'||checkIt== '^')
        {
            return verify= true;
        }
        else
        {
            return verify= false;
        }

        return verify;
    }

    public static  BinaryExpression myMakeBiniray(char ops,Expression leftOp, Expression rightOp)
    {


        switch (ops)
        {

            case '+':
                Expression left = leftOp;
                Expression right = rightOp;
               return Expression.MakeBinary(ExpressionType.Add, left, right);
               // return Expression.MakeBinary(ExpressionType.Add, Expression.Constant(2), Expression.Constant(4));

            case '-':
                return Expression.MakeBinary(ExpressionType.Subtract, Expression.Constant(leftOp), Expression.Constant(rightOp));

            case '*':
               return Expression.MakeBinary(ExpressionType.Multiply, Expression.Constant(leftOp), Expression.Constant(rightOp));

            case '/':
              return  Expression.MakeBinary(ExpressionType.Divide, Expression.Constant(leftOp), Expression.Constant(rightOp));

            case '^':
               return Expression.MakeBinary(ExpressionType.Power, Expression.Constant(leftOp), Expression.Constant(rightOp));

            default:
                return null;

        }

    }
    static void Main(string[] args)
    {

        Console.WriteLine("Enter mathematical expression : ");


        string input = "12+";

        Stack<Expression> ex = new Stack<Expression>();



        for (int i = 0; i < input.Length; i++)
        {

            var d = input[i];
            if (!isOp(d))
            {
                Expression constacntNumberExpression = Expression.Constant(d);
                ex.Push(constacntNumberExpression);
            }
            else
            {
                Expression popLeft = ex.Pop();
                Expression popRight = ex.Pop();
                BinaryExpression node=  myMakeBiniray(d, popLeft, popRight);
                ex.Push(node);
            }
        }

我很难理解问题的根源, 任何帮助将不胜感激!

【问题讨论】:

    标签: c# .net algorithm .net-core rpn


    【解决方案1】:

    当您将数字表达式添加到堆栈中时,您需要将输入从 char 转换为 int。

    更改 Main 的这一部分:

    var d = input[i];
    if (!isOp(d))
    {
        Expression constacntNumberExpression = Expression.Constant(d);
        ex.Push(constacntNumberExpression);
    }
    

    收件人:

    var d = input[i];
    if (!isOp(d) && Char.IsNumber(d))
    {
        var constantNumber = Char.GetNumericValue(d);
        Expression constacntNumberExpression = Expression.Constant(constantNumber);
        ex.Push(constacntNumberExpression);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 2011-04-08
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多