Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么列表<;T>;声明GetEnumerator()和IEnumerable<;T>;。GetEnumerator()?_C#_Interface_Ienumerable_Ienumerator_Explicit Interface - Fatal编程技术网

C# 为什么列表<;T>;声明GetEnumerator()和IEnumerable<;T>;。GetEnumerator()?

C# 为什么列表<;T>;声明GetEnumerator()和IEnumerable<;T>;。GetEnumerator()?,c#,interface,ienumerable,ienumerator,explicit-interface,C#,Interface,Ienumerable,Ienumerator,Explicit Interface,为什么列表定义了这三种方法 public Enumerator GetEnumerator() => new Enumerator(this); IEnumerator<T> IEnumerable<T>.GetEnumerator() => new Enumerator(this); IEnumerator IEnumerable.GetEnumerator() => new

为什么列表定义了这三种方法

    public Enumerator GetEnumerator()
        => new Enumerator(this);

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
        => new Enumerator(this);

    IEnumerator IEnumerable.GetEnumerator()
        => new Enumerator(this);
就这样就够了吧:

public Enumerator GetEnumerator()
        => new Enumerator(this);
public Enumerator GetEnumerator()
       => new Enumerator(this);
不,它不会,因为这不会实现
IEnumerable
IEnumerable
,其中
GetEnumerator()
方法的返回类型分别为
IEnumerator
IEnumerator

为了实现接口,返回类型必须匹配

事实上,自己测试这一点很容易:

使用系统集合;
使用System.Collections.Generic;
公共类MyList:IEnumerable
{
公共枚举器GetEnumerator()=>
新枚举数();
//充分实现这一点,以便我们能够集中精力于IEnumerable
公共结构枚举器:IEnumerator
{
公共T电流=>默认值;
对象IEnumerator.Current=>default;
公共bool MoveNext()=>true;
公共无效重置(){}
public void Dispose(){}
}
}
这会产生以下错误:

  • 错误CS0738:“MyList”未实现接口成员“IEnumerable.GetEnumerator()”MyList.GetEnumerator()无法实现“IEnumerable.GetEnumerator()”,因为它没有匹配的返回类型“IEnumerator”
  • 错误CS0738:“MyList”未实现接口成员“IEnumerable.GetEnumerator()”MyList.GetEnumerator()无法实现“IEnumerable.GetEnumerator()”,因为它没有匹配的返回类型“IEnumerator”

枚举器GetEnumerator()
允许它返回一个结构枚举器,以便在
foreach
循环中使用,而无需分配
IEnumerator IEnumerable.GetEnumerator()
允许它从
IEnumerable
接口实现
IEnumerator GetEnumerator()
方法,因此您可以执行
IEnumerable x=new List();foreach(x中的var项目).