【发布时间】:2018-08-09 23:20:09
【问题描述】:
我的代码收到此错误消息:“从范围 '' 引用的类型为 'System.Int32' 的变量 'assignVal',但未定义”
我签了
- Lambda compilation throws "variable '' of type '' referenced from scope '', but it is not defined"
- variable '' of type '' referenced from scope '', but it is not defined
但不幸的是,我的示例似乎更简单,但由于某种原因仍然无法正常工作。
这是我的代码:
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();
}
}
}
这个代码示例看起来很简单,应该可以按原样工作,而且我正在重用表达式,所以我不太明白为什么会出现这个错误。
【问题讨论】:
-
错误发生在哪一行?
-
@Claies .Compile 调用导致错误发生。
-
是的,但是代码中的哪一行导致错误发生?您的问题正文说错误与
variable 'assignVal'有关,但您发布的代码中没有该名称的变量。 -
@Claies 我的错。当我添加更多样本时重命名变量 - 它是“assignmentValue”
-
除非其中的异步部分实际上是相关的,否则如果您删除它会简化事情。我会先让同步器工作。
标签: c# expression