NerdDinner 示例的 Dining.GetRuleViolations 函数如何返回列表?
-
05-07-2019 - |
题
从我读到的来看,
yield return <value>
该行执行后立即跳出函数。然而,斯科特·格思里 (Scott Guthrie) 的文字表明
var errors = dinner.GetRuleViolations();
尽管 GetRuleViolations 是一长串,但仍成功提取所有规则违规的列表
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
这是如何运作的?
解决方案
它不会返回列表。它返回IEnumerable<RuleViolation>
。 yield return
在迭代器方法。迭代器是一种在方法中生成元素序列的简单方法。
其他提示
yield关键字使用的是所谓的 懒惰的评价。这意味着什么 实际上就是以下任何事情 a <!> quot; yield return <!> quot;不会被评估 直到它被要求 枚举器。
另请参阅Eric Lippert关于Iterator Blocks的博客。
第1部分
第2部分 - 为什么没有参考或输出参数
第3部分 - 为什么最终没有收益
第4部分 - 为什么没有捕获产量
第5部分 - Push vs Pull
第6部分 - 为什么没有不安全的代码
它有效是因为 yield return
返回一个值到枚举器对象,基本上为您自动化一些管道代码(即它是语法糖)。它不会导致方法返回,那就是 yield break
.
更多信息:
不隶属于 StackOverflow