从范围“引用的类型为”的变量“,但未定义”

时间:2018-08-09 23:20:10

标签: c# expression

我的代码收到此错误消息:“从作用域”引用的类型为'System.Int32'的变量'assignVal',但未定义”

我已签出

但不幸的是,我的示例似乎更简单,由于某些原因仍然无法正常工作。

这是我的代码:

EmpGuid.AddRange(teamLeader.Select(x=>x.EmpGuid));

此代码示例似乎足够简单,应该可以按原样工作,并且我正在重用表达式,所以我不太明白为什么会收到此错误。

2 个答案:

答案 0 :(得分:3)

您没有在Block调用中包含要使用的变量。

如果您更改此设置:

var lambda = Lambda<Func<int, int>>(Block(
    Assign(assignmentValue, Add(inParam, Constant(1))),
    Assign(retVal, assignmentValue),
    retVal
), inParam);

对此:

var lambda = Lambda<Func<int, int>>(Block(
    // This is the line I've added
    new[] { assignmentValue, retVal },
    Assign(assignmentValue, Add(inParam, Constant(1))),
    Assign(retVal, assignmentValue),
    retVal
), inParam);

它工作正常。

基本上,您正在使用Block(params Expression[])重载,它仅适用于没有变量的块。

答案 1 :(得分:0)

对于那些从Google上点击过的人->

此代码对两个任务均适用。雏菊是第一个回答的人。所以给他/她投票

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq.Expressions;
using System.Reflection.Emit;
using System.Threading.Tasks;
using static System.Linq.Expressions.Expression;

namespace ExpressionTests
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine(GetSyncAddExpression()(5) == 6);
            Console.ReadKey();

            Console.WriteLine(await GetTaskAddExpression()(5) == 6);
            Console.ReadKey();
        }

        private static Func<int, Task<int>> GetTaskAddExpression()
        {
            var fromResultMethod = typeof(Task).GetMethod(nameof(Task.FromResult)).MakeGenericMethod(typeof(int));

            var inParam = Parameter(typeof(int), "p1");
            var assignmentValue = Variable(typeof(int), "assignVal");
            var retVal = Variable(typeof(Task<int>));

            var lambda = Lambda<Func<int, Task<int>>>(Block(
                new[] { assignmentValue, retVal },
                Assign(assignmentValue, Add(inParam, Constant(1))),
                Assign(retVal, Call(null, fromResultMethod, assignmentValue)),
                retVal
            ), inParam);

            if (Debugger.IsAttached)
                Debugger.Break();

            return lambda.Compile();
        }

        private static Func<int, int> GetSyncAddExpression()
        {
            var inParam = Parameter(typeof(int), "p1");
            var assignmentValue = Variable(typeof(int), "assignVal");
            var retVal = Variable(typeof(int));

            var lambda = Lambda<Func<int, int>>(Block(
                new[] {assignmentValue, retVal},
                Assign(assignmentValue, Add(inParam, Constant(1))),
                Assign(retVal, assignmentValue),
                retVal
            ), inParam);

            if (Debugger.IsAttached)
                Debugger.Break();

            return lambda.Compile();
        }
    }
}