gpt4 book ai didi

c# - "variable ' ' of type ' ' referenced from scope ' ', but it is not defined"

转载 作者:行者123 更新时间:2023-11-30 21:33:03 25 4
gpt4 key购买 nike

我的代码收到此错误消息:“从范围‘’引用了‘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();
}
}
}

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

最佳答案

您没有在 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[]) 重载,它仅适用于没有变量的 block 。

关于c# - "variable ' ' of type ' ' referenced from scope ' ', but it is not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com