我的代码收到此错误消息:“从作用域”引用的类型为'System.Int32'的变量'assignVal',但未定义”
我已签出
但不幸的是,我的示例似乎更简单,由于某些原因仍然无法正常工作。
这是我的代码:
EmpGuid.AddRange(teamLeader.Select(x=>x.EmpGuid));
此代码示例似乎足够简单,应该可以按原样工作,并且我正在重用表达式,所以我不太明白为什么会收到此错误。
答案 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();
}
}
}