为什么迭代器方法不能采用“ref”或“out”参数?

2024-02-05

我今天早些时候尝试过这个:

public interface IFoo
{
    IEnumerable<int> GetItems_A( ref int somethingElse );
    IEnumerable<int> GetItems_B( ref int somethingElse );
}


public class Bar : IFoo
{
    public IEnumerable<int> GetItems_A( ref int somethingElse )
    {
        // Ok...
    }

    public IEnumerable<int> GetItems_B( ref int somethingElse )
    {
        yield return 7; // CS1623: Iterators cannot have ref or out parameters            

    }
}

这背后的理由是什么?


C# 迭代器内部是状态机。每次你yield return某些东西,您离开的地方应该与局部变量的状态一起保存,以便您可以返回并从那里继续。

为了保持这种状态,C# 编译器创建一个类来保存局部变量及其应继续的位置。这是不可能的ref or out作为类中的字段的值。因此,如果允许您将参数声明为ref or out,将无法保留我们停止时函数的完整快照。

EDIT:从技术上讲,并非所有方法都会返回IEnumerable<T>被视为迭代器。只是那些使用yield直接产生序列被视为迭代器。因此,虽然将迭代器拆分为两个方法是一个很好且常见的解决方法,但它与我刚才所说的并不矛盾。外部方法(不使用yield直接)是not被视为迭代器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么迭代器方法不能采用“ref”或“out”参数? 的相关文章

随机推荐

  • 如何在布局中包含布局?

    如何在Android布局中包含布局 我正在创建通用布局 我想将该布局包含在另一个页面中 Edit 正如评论中正确要求的更多信息 使用include tag
  • JavaScript 中的匿名函数命名有何不同?

    我正在分析 John Resig 网站上的以下两个 url 但我不明白为匿名函数命名有何不同 我的理解是 赋予匿名函数的名称只能在函数定义内部使用 而不能在函数定义之外使用 但在以下链接中它会产生巨大的差异 http ejohn org a
  • 核心数据:迁移后,额外的迁移代码

    我希望从版本 1 数据模型迁移到版本 2 但迁移完成后我希望执行一些自定义迁移代码 我如何知道迁移是否 何时发生 是否有migrationHasCompleed委托方法或通知 为了兴趣 我希望执行调整数据库中 png 大小的自定义迁移代码
  • 包括函数已知参数的不确定性,以在 python 中使用 curve_fit 进行拟合

    我在Python中使用不确定性包 我有一个像 A x N 这样的函数 其中 N 是一个具有不确定性的固定参数 例如 N 1 0 0 1 我想通过将方程拟合到数据集 y 来获得参数 A 但有错误 yerr 我尝试使用 uncertaintie
  • 两个java库互相导入?

    我正在开发一个遗留框架 显然有两个相互依赖的库 我的意思是libA进口于libB and libB进口于libA 首先我认为这是一个糟糕的设计 但为什么有人会这样做呢 相反 哪些条件可以导致某人写下此内容 edit 每个库都依赖于另一个库中
  • ListTile 的 SelectedTileColor 不起作用

    我有一个ListView其中包含ListTile被选中时会改变颜色 然而 在下面的代码中 当有中间时Container or SizedBox在 之间ListView和Scaffold SelectedTileColor不起作用 我跟着这个
  • Flink 中复杂拓扑(多输入)的集成测试

    我需要为 flink 流拓扑编写单元测试 这基本上是一个CoFlatMapFunction 并且它有 2 个输入 我尝试从这个页面中获得一些灵感 https ci apache org projects flink flink docs s
  • 如何将依赖项传递给@auth0-angular-jwt?

    所以 我正在迁移使用的 旧 代码HttpModule and angular2 jwt lib 以前 我可以做angular2 jwt使用以下配置 export function authHttpServiceFactory http Ht
  • 如何管理同一条记录的多个版本

    我正在为一家公司做短期合同工作 该公司试图为其数据库记录实施签入 签出类型的工作流程 这是它应该如何工作的 用户在应用程序中创建一个新实体 除了主实体表之外 还将填充大约 20 个相关表 创建实体后 用户会将其标记为主实体 另一个用户只能通
  • openssl_seal问题

    我在加载公钥以使用 PHP 中的 openssl seal 函数进行加密时遇到一些问题 我使用 openSSL 命令行工具创建了公钥和私钥 openssl genrsa des3 out private pem 1024 openssl r
  • 如何按多个字段对对象数组进行排序?

    由此原问题 https stackoverflow com q 979256 178383 如何对多个字段应用排序 使用这种稍微调整的结构 我将如何对城市 升序 和价格 降序 进行排序 var homes h id 3 city Dalla
  • 从左侧隐藏/显示

    我有这个代码可以用来隐藏 显示 我希望 div 在向左移动时隐藏 我怎样才能做到这一点 这就是我的FIDDLE http jsfiddle net dRpWv 306 JavaScript document ready function b
  • 用户未登录时重定向

    我在 App js 中有以下路线
  • ldap3 python修改用过滤器替换对象

    在应用ldapmodify时我们如何进行过滤 例如 这就是我的用户对象的样子 dn email protected cdn cgi l email protection ou users dc dev dc com sn po givenN
  • WP8应用程序中的付款

    我目前正在制作一个 Windows Phone 8 silverlight 应用程序 在应用程序中 我们希望允许用户通过 PayPal 或其他付款方式付款 我还从开发中心查找了应用内付款 但没有在那里看到具有可变值的付款 任何有关使用什么的
  • 如何判断哪些应用程序在 GAC 中注册了给定的程序集?

    当尝试使用 gacutil exe 删除给定程序集 在本例中为 log4net dll 但它应该适用于任何类似情况 时 由于应用程序需要该程序集 操作会失败 但是 我不知道如何判断哪些应用程序实际需要它 由于输出似乎表明该要求已记录在 MS
  • PHP 水印 - Zubrag

    我正在使用 zubrags PHP 水印脚本 附在下面 它的效果很好 除非我尝试使用 PNG 24 作为我的水印 生成的图像带有乱码 不透明的水印 我想知道是否有人可以帮助解释我需要在下面的脚本中更改哪些内容 以便将 PNG 24 作为正确
  • 找不到合适的 SDK 来定位

    我尝试为 UWP 创建项目 但收到此错误 我安装了 Windows 开发工具包并且它有效 谢谢
  • 使用 $http 访问原始 XHR 对象

    我需要访问原始数据XMLHttpRequest对象在支持它的浏览器上添加文件上传进度回调 这是可能的 还是我必须自己构建原始请求 如果是这样 我该如何包装生的XMLHttpRequest在承诺对象中 我模拟了 http调用构建自定义XMLH
  • 为什么迭代器方法不能采用“ref”或“out”参数?

    我今天早些时候尝试过这个 public interface IFoo IEnumerable