c# - 如何列出.Enumerator 没有按照其接口的要求实现 Reset?
问题描述
在实现我自己的集合时,我通过将所有对象复制到一个列表中来模拟枚举器,然后将所有枚举器调用重定向到列表的枚举器,我存储了一个引用。但是当 List.Enumerator 没有 Reset 方法时,我遇到了问题;尽管它实现了 IEnumerator。
这是有问题的反映标题(已删除评论)
public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
{
public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator
{
public T Current { get; }
public void Dispose();
public bool MoveNext();
}
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
我们可以看到 List.Enumerator 从 IEnumerator 派生两次;首先显式,然后通过 IEnumerator 隐式。但是这个示例程序不会编译。
List<int> list = new List<int>();
List<int>.Enumerator enumerator = list.GetEnumerator();
enumerator.Reset();
错误 CS1061“List.Enumerator”不包含“Reset”的定义,并且找不到接受“List.Enumerator”类型的第一个参数的扩展方法“Reset”(您是否缺少 using 指令或程序集引用?)
List.Enumerator 怎么可能不实现/公开在其接口之一中声明的方法?
解决方案
该Reset
方法通过显式接口实现来实现。请参阅:https ://source.dot.net/#System.Private.CoreLib/shared/System/Collections/Generic/List.cs,1141
因此,它不是公共成员List<T>.Enumerator
推荐阅读
- angular - 尝试访问创建的新属性时未定义
- java - java.lang.NumberFormatException:对于输入字符串:“”在使用ticker进行倒计时时出现此错误
- python-3.x - 如何使用继承修改 Python 模块中的变量值
- c# - 如何在 Blazer 组件中注册 http 客户端服务
- ios - 从特殊字符范围创建字符串时出现 Swift 错误
- python - 如何获得返回的字符串长度?
- c++ - W10/Wins32 C++ 如何确定哪些字符可用于写入 HDC
- c# - 如何将 HttpClientHandler 传递给现有的 HttpClient?
- go - golang中没有固定长度的数组
- windows - 为什么我的 powershell 显示为盒装而不是 V 形?