C#:lambda,在创建时而不是执行时对参数求值

C#:lambda,在创建时而不是执行时对参数求值,c#,lambda,parameters,evaluation,C#,Lambda,Parameters,Evaluation,代码如下: pages[i][0] = create("[Back]", () => setMenu(pages[i - 1])); 问题是,当执行操作时,它使用特定范围中的i,因为我将它用于我的for,所以它始终是最大值。在我的例子中,参数变为2,即使lambda是使用1创建的。为了解决这个问题,我做了: var forcedCopy = i - 1; pages[i][0] = create("[Back]", () => setMenu(pages[forcedCopy]))

代码如下:

pages[i][0] = create("[Back]", () => setMenu(pages[i - 1]));
问题是,当执行
操作时,它使用特定范围中的
i
,因为我将它用于我的
for
,所以它始终是最大值。在我的例子中,参数变为
2
,即使lambda是使用
1
创建的。为了解决这个问题,我做了:

var forcedCopy = i - 1;
pages[i][0] = create("[Back]", () => setMenu(pages[forcedCopy]));

有什么办法可以绕过这个难看的把戏吗?我想通过
myFunc(0)
myFunc(1)
,等等,而不是
myFunc(I)

不,没有。创建手动副本是最好的选择。实际上,您正在传递变量,因此这是正常行为。您可以这样做:
var tempInt=i
然后在lambda中使用tempInt(只是一个示例,tempInt是不好的命名,不要这样做)的可能重复。您不能创建一个创建该操作的方法吗?在这种情况下,您可以自动捕获对所需页面的引用(现在我假设使用一些
page
class)<代码>私人操作CreateSetMenuAction(第p页)=>()=>setMenu(第p页)。也就是说,创建一个局部变量并在lambda表达式中捕获它是正常的做法。@Knoop,我也可以这样做,但问题是我是否可以不复制就这样做。不,没有。创建手动副本是最好的选择。实际上,您正在传递变量,因此这是正常行为。您可以这样做:
var tempInt=i
然后在lambda中使用tempInt(只是一个示例,tempInt是不好的命名,不要这样做)的可能重复。您不能创建一个创建该操作的方法吗?在这种情况下,您可以自动捕获对所需页面的引用(现在我假设使用一些
page
class)<代码>私人操作CreateSetMenuAction(第p页)=>()=>setMenu(第p页)。也就是说,创建一个局部变量并在lambda表达式中捕获它是正常的做法。@Knoop,我也可以这样做,但问题是我是否可以不复制就这样做。