C# IEnumerable<;int>;还需要非泛型IEnumerator?
3个问题: 1) 为什么输出来自非通用函数 2) 为什么我也有来实现非泛型功能 3) 如果我想看到泛型函数输出(int),我需要做什么C# IEnumerable<;int>;还需要非泛型IEnumerator?,c#,.net,generics,ienumerable,C#,.net,Generics,Ienumerable,3个问题: 1) 为什么输出来自非通用函数 2) 为什么我也有来实现非泛型功能 3) 如果我想看到泛型函数输出(int),我需要做什么 您需要同时实现这两个功能,因为IEnumerable是从IEnumerable派生而来的。要调用显式实现的方法,需要强制转换到该接口 但是通常您显式地实现非泛型方法,隐式地实现泛型方法。这样一来,foreach将使用通用方法foreach对集合的类型使用GetEnumerator()方法,并且仅在不存在此方法时才返回到接口方法 典型的实现是: public IE
您需要同时实现这两个功能,因为
IEnumerable
是从IEnumerable
派生而来的。要调用显式实现的方法,需要强制转换到该接口
但是通常您显式地实现非泛型方法,隐式地实现泛型方法。这样一来,foreach
将使用通用方法foreach
对集合的类型使用GetEnumerator()
方法,并且仅在不存在此方法时才返回到接口方法
典型的实现是:
public IEnumerator<int> GetEnumerator()
{
...
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();//Forward to strongly typed version
}
public IEnumerator GetEnumerator()
{
...
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
返回GetEnumerator();//转发到强类型版本
}
foreach
关键字根本不要求集合实现IEnumerable
;相反,它将调用任何已定义的GetEnumerator
方法IEnumerable
实现了IEnumerable
IEnumerable.GetEnumerator()
,并让普通方法返回IEnumerator
GetEnumerator()
方法(与显式接口实现相反),编译器将调用它。说明书上说:
- 否则,确定类型X是否具有适当的GetEnumerator方法:
- 使用标识符GetEnumerator和无类型参数对类型X执行成员查找。如果成员查找未生成匹配项, 或者它产生了歧义,或者产生了不是方法的匹配 组,检查可枚举接口,如下所述。它是 建议在成员查找产生错误时发出警告 除方法组或不匹配之外的任何内容
- 使用生成的方法组和空参数列表执行重载解析。如果重载解析结果为“否” 适用的方法,导致歧义,或导致单一 最好的方法,但该方法要么是静态的,要么不是公共的,请检查 如下所述的可枚举接口。建议 如果重载解析产生除 明确的公共实例方法或没有适用的方法
- [……]
- 否则,请检查可枚举接口:
IEnumerable
继承自IEnumerable
,因此继承自IEnumerable
的任何类型也必须实现IEnumerable
的成员
3) 使泛型定义隐式,非泛型定义显式,例如
public class Class1 : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
公共类Class1:IEnumerable
{
公共IEnumerator GetEnumerator()
{
收益率1;
收益率2;
收益率3;
收益率4;
}
IEnumerator IEnumerable.GetEnumerator()
{
返回此.GetEnumerator();
}
}
请注意,您可以从非泛型方法返回泛型枚举数,因为
IEnumerator
继承自IEnumerator
返回GetEnumerator()//Fo
有错误:迭代器不能包含return语句…@RoyiNamir:除去yield
s。其他读数:。