首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在主函数中调用GetEnumerator()时,.Current给了我一个异常

在主函数中调用GetEnumerator()时,.Current给了我一个异常。这个问题通常发生在使用迭代器时,当调用MoveNext()方法之前或者在迭代器结束后调用.Current属性时会引发异常。

迭代器是一种特殊的方法,它可以通过yield关键字来生成一个序列。在调用GetEnumerator()方法后,迭代器会返回一个实现了IEnumerator接口的对象。该接口包含了MoveNext()方法和Current属性。

异常的原因可能是以下几种情况之一:

  1. 在调用MoveNext()方法之前调用了.Current属性。在迭代器刚开始时,必须先调用MoveNext()方法来移动到序列的第一个元素,然后才能访问.Current属性获取当前元素的值。
  2. 在迭代器结束后调用了.Current属性。一旦迭代器遍历完序列中的所有元素,它就会停止迭代。此时再调用.Current属性会引发异常。可以通过重新调用GetEnumerator()方法来重新开始迭代。

为了解决这个问题,可以按照以下步骤进行操作:

  1. 确保在调用.Current属性之前已经调用了MoveNext()方法。例如:
代码语言:txt
复制
var enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
    var current = enumerator.Current;
    // 处理当前元素
}
  1. 在迭代器结束后,重新调用GetEnumerator()方法以重新开始迭代。例如:
代码语言:txt
复制
var enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
    var current = enumerator.Current;
    // 处理当前元素
}

// 迭代器结束后重新开始迭代
enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
    var current = enumerator.Current;
    // 处理当前元素
}

总结起来,当在主函数中调用GetEnumerator()时,.Current给了一个异常,通常是因为在调用MoveNext()方法之前或者在迭代器结束后调用了.Current属性。确保按照正确的顺序调用这些方法,并在需要重新开始迭代时重新调用GetEnumerator()方法即可解决该问题。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET面试题系列 - IEnumerable

想知道如何实现方法GetEnumerator,不妨思考下实现了GetEnumerator之后的类型Foreach之下的行为: 可以获得第一个或当前成员 可以移动到下一个成员 可以集合没有下一个成员退出循环...当你呼叫,你会得到一个异常,这是因为编译器没有实现该方法。...尽管我们呼叫了GetItems方法,先打印出来的句子却是函数的句子。...return result; case 3: this.1__state = -1; break; 这也就解释了为什么第一个打印出来的句子函数...迭代的过程改变集合的状态 foreach迭代不能直接更改集合成员的值,但如果集合成员是类或者结构,则可以更改其属性或字段的值。不能在为集合删除或者增加成员,这会出现运行时异常

64720
  • Linux+Windows: 程序崩溃 C++ 代码,如何获取函数调用栈信息

    一、前言 二、Linux 平台 三、Windwos 平台 一、前言 程序执行过程 crash 是非常严重的问题,一般都应该在测试阶段排除掉这些问题,但是总会有漏网之鱼被带到 release 阶段。...因此,程序的日志系统需要侦测这种情况,代码崩溃的时候获取函数调用栈信息,为 debug 提供有效的信息。...这篇文章的理论知识很少,直接分享 2 段代码: Linux 和 Windows 这 2 个平台上,如何用 C++ 来捕获函数调用栈里的信息。 二、Linux 平台 1....捕获异常,获取函数调用栈信息 void sigHandler(int signum, siginfo_t *info, void *ctx) { const size_t dump_size =...利用以上几个神器,基本上可以获取到程序崩溃函数调用栈信息,定位问题,有如神助! ----

    5.7K20

    认真CS☀️枚举器

    object Current { get; } // // 摘要: // 将枚举数推进到集合的下一个元素。...所以它能做IEnumerator接口定义的所有工作 3、对于有枚举器的类型而言,必须有一个方法来获取它,获取一个对象枚举器的方法是调用对象的GetEnumerator方法,实现GetEnumerator...方法的类型叫做可枚举类型(enumerable),数组是可枚举类型 释义: 所以在此案例,采用GetEnumerator()方法将获取到的数组的枚举器赋值给定义为枚举器类型的ie,GetEnumerator...()方法获取到的是返回的枚举器的实例 调用方法MoveNext要在前,Current方法在后。...否则会出现枚举器还处于数组序列第一项之前,便先要输出的Current值,结果错误。

    4510

    C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

    当枚举数位于此位置,对MoveNext 的后续调用也返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。...若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext。...(2)、Current属性   ---返回正在遍历的集合的元素 (3)、Reset()   ---重置当前正在遍历的集合中元素的索引....第三步:具体实现 介绍完上面两个接口之后,开始具体的实现,现在需要编写一个People类,该类是一个Person集合,要求People类拥有foreach循环的功能,代码如下: public class...通过自定义集合类的构造函数,或者方法,或者属性(都可以),初始化一个类数组   !

    938100

    小解c# foreach原理

    但是不要以为到这里就完了,Cat 类仅仅包含这些是没有任何意义的,这些内容只是为了让程序通过编译而已,实际开发我们遍历的对象是一个序列,那么我们现在就在 Cat 类添加一个固定的序列: class...这时我们可以将数据对象通过 GetEnumerator 方法作为迭代计数器对象(CatEnumerator)构造函数的参数传递进去,然后迭代计数器对象提供一个属性将这些数据存储起来。...我们可以迭代计数器对象定义一个 index 整型私有属性作为下标索引属性,这里需要注意的是我们 index 这个属性的默认值为 -1 ,这一点是很多新手开发人员比较容易出错的地方。...通过前面所述的内容,我们可知 foreach 遍历主要有三个步骤: foreach 调用当前可遍历类型的 GetEnumerator 方法创建一个迭代计数器对象,并将要遍历的数据传递给迭代计数器对象的构造函数...; 迭代计数器对象调用它 MoveNext 方法将所以小标递增 1 ,若下标大于数据长度则迭代完成; MoveNext 方法返回 true 并返回 Current 属性存储的数据。

    1K11

    小解c# foreach原理

    但是不要以为到这里就完了,Cat 类仅仅包含这些是没有任何意义的,这些内容只是为了让程序通过编译而已,实际开发我们遍历的对象是一个序列,那么我们现在就在 Cat 类添加一个固定的序列: class...这时我们可以将数据对象通过 GetEnumerator 方法作为迭代计数器对象(CatEnumerator)构造函数的参数传递进去,然后迭代计数器对象提供一个属性将这些数据存储起来。...我们可以迭代计数器对象定义一个 index 整型私有属性作为下标索引属性,这里需要注意的是我们 index 这个属性的默认值为 -1 ,这一点是很多新手开发人员比较容易出错的地方。...通过前面所述的内容,我们可知 foreach 遍历主要有三个步骤: foreach 调用当前可遍历类型的 GetEnumerator 方法创建一个迭代计数器对象,并将要遍历的数据传递给迭代计数器对象的构造函数...; 迭代计数器对象调用它 MoveNext 方法将所以小标递增 1 ,若下标大于数据长度则迭代完成; MoveNext 方法返回 true 并返回 Current 属性存储的数据。

    62110

    C Sharp(十三)

    C Sharp(十三) 發佈於 2018-11-19 这一篇,我们看看 C# 的枚举器和迭代器的基本概念。...因为数组可以提供一个枚举器(enumerator)对象。枚举器对象可以依次返回数组元素。 获取一个对象的枚举器可以调用对象的 GetEnumerator 方法。...foreach 语句就是用来配合可枚举类型一起使用的,他会执行下列行为: 调用 GetEnumerator 方法获取对象的枚举器 从枚举器请求每一项作为迭代变量(iteration variable)...枚举器原始位置第一项之前,因此使用 Current 之前必须先调用 MoveNext Reset: 位置重置为原始状态 下面代码与直接使用 foreach 产生的结果是一样的: using System.Collections...IEnumerable 只有一个函数成员: GetEnumerator: 获取可枚举类型的枚举器 using System.Collections; class MyClass : IEnumerable

    59720

    认真CS☀️yield迭代

    首先我们来说下迭代的目的: 迭代是将自定义类变为自定义类数组,并遍历它 C#1.0和C#2.0这两个版本,C#2比C#1多了一个更简洁的迭代方法 C#1.0 1️⃣ 实现迭代的操作流程: 1、定义单个类...,当编译器检测到迭代器,他将自动生成IEnumerable接口的Current、MoveNext、Dispose方法。...GetEnumerator方法 一个类产生多个可枚举类型,而是采用不实现GetEnumerator的方法,Main方法直接调用返回可枚举类型的迭代器,即上文的“b、不实现GetEnumerator也可枚举的方法...再次重申一下,迭代器块可作为方法主体、访问器块主体和运算符主体 5️⃣ 其他注意事项 在编译器生成的IEnumerator枚举器方法,Reset方法(用来重置)并没有实现,因此调用它会抛出System.NotSpportedception...异常

    7610

    C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

    可以将T理解为类型的一个占位符, 即告诉编译器, 调用泛型必须为其指定一个实际类型. 1.2.1 已构造泛型又可分为开放类型和密封类型....null的类型调用方法将出现异常, 所以一般引用类型调用方法前, 最好先检查下它是否为null 9 nullableWithoutValue.GetType(); 10 11 //装箱操作 12...obj; 前面说了 对于没有值得可空类型调用函数时会抛出空引用异常, 但是仍然可以访问HasValue属性....C#1.0, 一个要想使用foreach关键字进行遍历, 它必须实现IEnumerable或者IEnumerable接口....既然IEnumerator对象是一个访问器。那至少应该有一个Current属性,来获取当前集合的项吧。

    1.2K110

    通过运行期类型检查实现泛型算法

    针对这一点 C# 允许发现类型参数所表示的对象具有更多的功能编写更具体的代码。...这一点是利用了泛型依据对象的编译器类型来进行实例化的这一特点,如果我们开发没有想到这一点就有很大的可能降低程序的性能。...首次调用这个方法时会把输入的序列访问一遍,然后让嵌套类可以在这个列表上反向访问元素。...要解决这个问题我们只需要修改一下 DemoEnumerable 的构造函数然后增加一个参数为 IList 类型的构造函数即可: public DemoEnumerable(IEnumerable...,还可以它所表示的类型具备很多功能提供更好的实现方式,但是我们需要在算法的效率和泛型的复用程度之间找到平衡点。

    61610

    分享|C# yield关键字解析

    yield return 返回集合不是一次性返回所有集合元素,而是一次调用返回一个元素。具体如何使用yield return 返回集合呢?我们一起往下面看吧。。...我们可以通过这个构造函数往待测试集合存入1-100这100个测试数据 { _numArray = new List(); //给集合变量开始堆内存上开内存...我们可以通过这个构造函数往待测试集合存入1-100这100个测试数据 { _numArray = new List(); //给集合变量开始堆内存上开内存...这里说明是一次调用就返回了一个元素。 通过上面的案例我们可以发现,yield return 并不是等所有执行完了才一次性返回的。而是调用一次就返回一次结果的元素。这也就是按需供给。...我们首先看这么一个案例(0-10随机返回五个数字): 我们通过SharpLab反编译其代码,我们进行查看发现yield具体详细实现: ? ? 我们看到yield内部含有一个迭代器。

    69810

    C#的枚举器(译)

    我们将以创建一个简单化的List Box作为开始,它将包含一个8字符串的数组和一个整型,这个整型用于记录数组已经添加了多少字符串。构造函数将对数组进行初始化并使用传递进来的参数填充它。...ListBoxEnumerator的Current属性的实现是索引外部类(ListBox)的集合,并且返回找到的对象(这个例子,是一个字符串)。...public object Current { get { return(lbt[index]); } } 1.1,所有想要通过foreach循环来迭代的类都需要实现IEnumerable...那也就是,对GetEnumerator的每次调用都将会产生集合的下一个字符串;所有的状态管理已经都为你做好了! 就这样了,你已经完成了。...关于Yield的更多内容 作为对上一节的一些说明,应该告诉你:实际上,你可以yield语句块yield一个以上的值。

    1.8K40

    由for V.S. for each想到的

    他的本质是在编译的时候,把方法的调用嵌入调用堆栈转变成直接放方法体编译到调用堆栈从而获得performance上的提升。....但是对应virtual方法调用的运行时对象类型而非其申明类型定义的方法,在编译的时候,Complier是不可能获得某一个对象运行时属于什么类型的,所以它也不可能运用Inlining这种编译优化方案。...所以我们设计我们的类,如果你确确实实需要把某个方法定义成virtual 方法,否则千万不要这么做。如果父类的该方法是virtual或override,你最好封闭(sealed)它。  2....本例EmployeeEnumerator的Current实际上是一个ValueType的Emplyee struct,由于该属性的返回值是object,所以需要对获得的Emplyee进行装箱,使用的时候对它进行拆箱...其实这是无法避免的,因为for each会把获得的Enumerator转换成对应的接口类型IEnumerator,所以调用的永远是IEnumerator定义的返回类型为object的Current属性

    74990

    C# yield关键字解析

    yield return 返回集合不是一次性返回所有集合元素,而是一次调用返回一个元素。具体如何使用yield return 返回集合呢?我们一起往下面看吧。...我们可以通过这个构造函数往待测试集合存入1-100这100个测试数据 { _numArray = new List(); //给集合变量开始堆内存上开内存...我们可以通过这个构造函数往待测试集合存入1-100这100个测试数据 { _numArray = new List(); //给集合变量开始堆内存上开内存...这里说明是一次调用就返回了一个元素。 通过上面的案例我们可以发现,yield return 并不是等所有执行完了才一次性返回的。而是调用一次就返回一次结果的元素。这也就是按需供给。...我们首先看这么一个案例(0-10随机返回五个数字): 我们通过SharpLab反编译其代码,我们进行查看发现yield具体详细实现: ? ? 我们看到yield内部含有一个迭代器。

    91120

    C# 学习笔记(10)—— 可空类型、匿名方法、迭代器

    如果为 null,CLR将不会进行实际的装箱操作(因为 null 可以直接赋给一个引用类型变量);如果不为 null,CLR则从可空类型对象获取值,并对该值进行装箱(即值类型的装箱过程) 当把一个已装箱的值类型赋给可空类型变量...因为没有名字,匿名方法只能再函数定义的时候被调用,再其他任何情况下都不能被调用。...来返回一个迭代器,也就是一个集合的初始位置 C# 1.0 如何实现迭代器 C# 1.0 一个类型要想使用foreach关键字进修班i案例,它必须要实现IEnumerable或IEnumerable...,因此也就可以使用foreach语句了 C# 1.0 ,要获取迭代器,就必须要实现 IEnumerable或GetEnumerator 方法;而要实现一个迭代器,就必须要实现IEnumerable...C# 1.0 ,要使用某个类型可以迭代要写大量代码的。

    17230
    领券