表达式执行顺序

时间:2015-04-30 16:32:02

标签: c#

不应该返回6而不是8吗?它是否以这种方式工作,使用表达式组合返回一个大表达式,这应该评估为2+2*2 instaed (2+2)*2

static void Main(string[] args)
        {
            var response = Mul();
            var result = response.Compile().Invoke();
        }

        public static Expression<Func<double>> Add()
        {
            return Expression.Lambda<Func<double>>(Expression.Add(EvaluateConst().Body, EvaluateConst().Body));
        }

        public static Expression<Func<double>> Mul()
        {
            return Expression.Lambda<Func<double>>(Expression.Multiply(EvaluateConst().Body, Add().Body));
        }

        public static Expression<Func<double>> EvaluateConst()
        {
            return () => 2;
        }

3 个答案:

答案 0 :(得分:4)

返回值“8”在这里有意义。

在运行$contacts_needed = array('tom','joe'); $all_contacts = array( 'tom' => array('age'=>20, 'sex'=>'m'), 'jack' => array('age'=>33, 'sex'=>'f'), 'rob' => array('age'=>33, 'sex'=>'m'), 'joe' => array('age'=>33, 'sex'=>'m'), 'jill' => array('age'=>20, 'sex'=>'f'), ); $contacts = array_intersect_key($all_contacts, array_flip($contacts_needed)); print_r($contacts); 之前,必须完全确定其参数。所以每个函数都运行。

  • 第一个评估为“2”。
  • 第二个,添加,评估为“4”

2 * 4是8。

答案 1 :(得分:3)

不,不应该。如果它应该有,它会有。你的指令是将2乘以加法结果,因为你将2和加法结果作为乘法运算。

答案 2 :(得分:1)

您将操作符作为函数的参数传递。虽然编译器可以看到2+2*2并跳转到Add(2, Multiply(2, 2)),但表达式却没有。一个简单的方法是思考(或者更确切地说,实现,因为它是真的)运算符是静态函数,或用方法调用表达式替换运算符表达式。