我的代码收到此错误消息:“从范围''引用的'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)
这个代码示例看起来很简单,它应该按原样工作,我正在重用这些表达式,所以我不太明白为什么我会收到这个错误。
您没有在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[])重载,它只适用于没有变量的块。
| 归档时间: |
|
| 查看次数: |
2425 次 |
| 最近记录: |