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

Dbl*_*Dbl 4 c# expression

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

我退房了

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

这是我的代码:

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(
                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(
                Assign(assignmentValue, Add(inParam, Constant(1))),
                Assign(retVal, assignmentValue),
                retVal
            ), inParam);

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

            return lambda.Compile();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个代码示例看起来很简单,它应该按原样工作,我正在重用这些表达式,所以我不太明白为什么我会收到这个错误。

Jon*_*eet 6

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

如果你改变这个:

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

对此:

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);
Run Code Online (Sandbox Code Playgroud)

它工作正常。

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