【发布时间】:2013-11-30 20:57:41
【问题描述】:
基本上我想要一个可以自行返回的委托。我对下面理论上想要的内容进行了非常简单的简化:
int i =0;
var x = () =>
{
if (i > 10)
return null;
++i;
Debug.Log("keep going");
return x;
};
var y = x;
while ((y = y()) != null) ;
当然,预期的输出是在控制台中看到“继续”10 次。我只是想知道在这种语言中这是否可能(我知道我可以使用 for 循环实现相同的目标)。例如,在 JavaScript 中使用与上面非常相似的代码进行操作很简单,但我无法让编译器与 C# 配合。我认为失败在于无法正确描述“x”(Func<Func<Func... 的类型,你有点想要前向声明之类的东西。
【问题讨论】:
-
你自己试过了吗
-
这种代码是否有用?
-
@JulieShannon 是的,我已经尝试了上面的确切代码,但它抱怨“var”(也许我应该提到我在 Unity 中的 Mono 上运行(.NET 2 兼容性),所以也许上面的代码在较新的 C# 运行时中是完全合法的。
-
这个概念在 C# 中不能直接实现,原因很简单:函数
x的返回类型是什么?只有当类型以某种方式“模糊”时才有可能。你可能想看看这个:stackoverflow.com/questions/2679547/… -
@lazyberezovsky 使用这种技术的代码在函数式编程中非常常见。例如,您可以有一个解析器函数,它返回解析的下一步:
while (parse = parse(stream)) yield return wait_for_more_data;解析器的状态在 lambda 闭包中被捕获,因此使解析器可暂停变得微不足道。不过,我不想再讨论替代策略,我只是想知道 C# 是否可以处理这个问题。