![]() |
1
98
埃里克·利珀特最近写了一系列的博客文章,解释为什么在某些情况下不允许让步。 编辑2:
你可能会在那里找到答案… Edit1:这在第5部分的评论中解释,在埃里克对Abhijeet Patel评论的回答中: 问:
答:
|
![]() |
2
19
埃里克·利珀特写了一系列关于限制(以及影响这些选择的设计决策)的优秀文章 iterator blocks 特别是迭代器块是通过一些复杂的编译器代码转换实现的。这些转换会影响匿名函数或lambda中发生的转换,因此在某些情况下,它们都会尝试将代码“转换”为与另一个不兼容的其他构造。 因此,禁止他们进行互动。 迭代器块在引擎盖下的工作方式处理得很好 here . 作为不相容性的一个简单例子:
编译器同时希望将其转换为如下内容:
同时,迭代器方面也在努力使它成为一个小状态机。某些简单的例子可以使用相当数量的健全性检查(首先处理(可能是任意的)嵌套闭包),然后查看最底层的结果类是否可以转换为迭代器状态机。 不过,这是
在您这样的例子中:
|
![]() |
3
2
不幸的是,我不知道他们为什么不允许这样做,因为当然,这是完全可以想象的,这将如何工作。 但是,匿名方法已经是“编译器魔术”的一部分,从这个意义上说,方法将被提取到现有类中的一个方法,甚至是一个全新的类,这取决于它是否处理局部变量。
此外,迭代器方法使用
我的猜测是,这两种方法中的一种使代码无法被另一种魔法所识别,并且决定不再花时间在C编译器的当前版本上。当然,这可能根本不是一个明智的选择,而且它只是不起作用,因为没有人想过要实现它。 对于100%准确的问题,我建议您使用 Microsoft Connect 网站和报告一个问题,我相信你会得到一些有用的回报。 |
![]() |
4
1
我会这样做:
当然,对于Linq方法,您需要从.NET 3.5引用System.Core.dll。包括:
干杯, 狡猾的 |
![]() |
5
-1
也许这只是一个语法限制。在与C非常相似的Visual Basic.NET中,编写起来很难,但却完全有可能
还要注意括号
由[1]转换的代码在C 7.3(CS0149)中引发错误:
我强烈反对其他答案中给出的编译器难以处理的原因。这个
在VB中,有
因此,如果您真的非常想要匿名迭代器函数,那么当前使用的是VisualBasic或(我还没有检查过)f,如 Part #7 在@thomas levesque的答案中(对于f,请按ctrl+f)。 |
![]() |
Ahmed Elbohoty · Python为什么我在这里没有输出 7 年前 |
![]() |
Aaron_ab · python-yield(yield)做什么? 7 年前 |
![]() |
Chancelot · 块执行的测试ruby屈服方法 7 年前 |
![]() |
georg · 从阵列创建的生成器列表中生成 7 年前 |
![]() |
TinyTheBrontosaurus · 如何在产量中扩展元组? 7 年前 |
![]() |
Eric Burel · 按顺序运行一系列sagas效果 7 年前 |
![]() |
geostocker · C#[重复]中的产量理解困难 7 年前 |