根据Eric Lippert的说法,匿名迭代器没有被添加到语言中,因为实现它会过于复杂。
这对我来说没关系,直到他们开始实现匿名异步方法。编译器必须为异步方法做与迭代器相同的事情(将它们转换为状态机),所以我很困惑为什么不允许使用匿名迭代器,而允许匿名异步方法。
有人能解释一下吗?
根据Eric Lippert的说法,匿名迭代器没有被添加到语言中,因为实现它会过于复杂。
这对我来说没关系,直到他们开始实现匿名异步方法。编译器必须为异步方法做与迭代器相同的事情(将它们转换为状态机),所以我很困惑为什么不允许使用匿名迭代器,而允许匿名异步方法。
有人能解释一下吗?
async
匿名方法更具有概念意义,不需要像匿名迭代器块那样进行重构,并且具有更加强烈的终端用户受益。看看这段代码(它并不起作用,只是一个例子):
Task<IEnumerable<int>> resultTask = new Task<IEnumerable<int>>(() =>
{
for (int i = 0; i < 10; ++i)
{
yield return i;
}
});
你不觉得它有点没有结构吗?
假设使用整个lambda范围,处理yield
"惰性"会非常困难且不值得。
然而,有很好的方法从并行任务中返回 yield
。
但让我们看看以下事情。定义一个带有yield
返回的方法:
static IEnumerable<int> GetIntegers()
{
for (int i = 0; i < 10; ++i)
{
yield return i;
}
}
Task<IEnumerable<int>> resultTask = new Task<IEnumerable<int>>(() =>
{
return GetIntegers();
});
yield
优势吗?
IEnumerable<int> e = enum { yield return 1; };
。 这将使参数验证变得更加简单,因为您不需要提取第二个方法。 - usr