繁体   English   中英

foreach循环内匿名函数中的委托没有关闭

[英]No closure for delegates in anonymous function inside foreach loop

更新:原来这是Unity3D使用的Mono编译器的问题。 我不确定当前版本的Mono(3.10.0)是否可以解决该问题,但是引擎(2.0.5)中使用的旧版本似乎无法为委托实现该功能,或者只是按需工作。


在我正在开发的游戏(在Unity3D引擎中)的某个时刻,玩家一次解锁了多个物品。 对于它们中的每一个,我必须显示一个简单的信息对话框,用户必须单击该对话框才能前进到下一个,直到全部被阅读。

我有一个简单的C#静态方法来显示对话框(在Unity中只是带有一些文本的彩色覆盖,而与C#UI框架没有任何关系):

ConfirmationDialog.Create("Item X Unlocked!", callback);

当用户最终按下对话框时,将callback

我想链接所有对话框,以便仅在单击上一个对话框时创建每个对话框 ,因此我尝试了以下操作:

Action callback = delegate {};

foreach (string item in unlockedItems) {
    var cb = callback;  // I though this would create a closure for delegates too
    callback = (() => ConfirmationDialog.Create(item + " Unlocked!", cb));
}
callback();

在我看来,这是有道理的,因为匿名函数将在循环的每次迭代中使用不同的“ cb”委托。 但是,似乎我弄错了,因为此代码似乎导致在单击时重复调用同一对话框 ,就像在递归函数中那样(我想这就是它的结果)。

我知道我可以例如做int value = i; 在for循环(其中i是循环迭代器)中使用匿名函数中的i的正确值(我发现了很多有关此内容的信息)。 代表们似乎有所不同,但特别是什么使他们不能以相同的方式工作? 还是我做错了什么? 我可以用类似的方式进行链接吗? 我说“相似”是因为我当然可以想到以其他(更复杂)的方式进行此操作...

注意:如果我对“ closure”,“ delegate”等词语的使用不正确,请纠正我:)

您是否可以控制ConfirmationDialog.Create("Item X Unlocked!", callback); API? 如果是这样,您应该考虑使用Task进行重构,而不是进行回调。 如果有的话,您可以简单地将一堆任务链接为延续,然后让它们一个接一个地执行。

我知道在游戏开发中,这些东西在本质上通常是非常异步的,UI的显示方式以及随后对它们做出反应的方式……因此您可以使用TaskCompletionSource处理某些可以表明您的任务已完成的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM