如何在C#中创建类型化IEnumerable?
我可以这样做:如何在C#中创建类型化IEnumerable?,c#,.net,interface,iterator,ienumerable,C#,.net,Interface,Iterator,Ienumerable,我可以这样做: public class EnumerableTest : System.Collections.IEnumerable { System.Collections.IEnumerable data; public EnumerableTest(System.Collections.IEnumerable d) { data = d; } public System.Collections.IEnumerator GetE
public class EnumerableTest : System.Collections.IEnumerable
{
System.Collections.IEnumerable data;
public EnumerableTest(System.Collections.IEnumerable d)
{
data = d;
}
public System.Collections.IEnumerator GetEnumerator()
{
foreach (object s in data)
{
yield return s;
}
}
}
但我不能这么做
public class EnumerableTestString : System.Collections.Generic.IEnumerable<string>
{
System.Collections.Generic.IEnumerable<string> data;
public EnumerableTestString(System.Collections.Generic.IEnumerable<string> d)
{
data = d;
}
public System.Collections.Generic.IEnumerator<string> GetEnumerator()
{
foreach (string s in data)
{
yield return s;
}
}
}
当我将GetEnumerator()
的返回类型更改为该类型时,它会告诉我缺少
public System.Collections.Generic.IEnumerator<string> GetEnumerator();
public System.Collections.Generic.IEnumerator GetEnumerator();
如果我尝试同时包含这两个,它会告诉我我有一个重复的方法名
如何解决这个问题?改为实现
System.Collections.Generic.IEnumerable
使用VS的智能标记执行此操作时,VS会自动创建两个方法。一个用于泛型实现,另一个用于非泛型实现(您已经拥有的),因为IEnumerable
要求您也实现IEnumerable
public class StringData : IEnumerable<string>
{
...
#region IEnumerable<string> Members
public IEnumerator<string> GetEnumerator()
{
foreach (string s in data) {
yield return s;
}
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator(); // Calls generic GetEnumerator
}
#endregion
}
公共类StringData:IEnumerable
{
...
#区域可数成员
公共IEnumerator GetEnumerator()
{
foreach(数据中的字符串s){
收益率;
}
}
#端区
#区域可数成员
IEnumerator IEnumerable.GetEnumerator()
{
返回此值。GetEnumerator();//调用通用GetEnumerator
}
#端区
}
请注意,非泛型方法是显式实现的,因此只能通过接口(IEnumerable x=…;x.GetEnumerator()
)进行访问。它的目的是增加兼容性,并且是前通用c#版本(1.0,1.1)的残余。创建这两个版本-例如,一个显式实现将调用隐式实现
示例:
public class EnumerableTestString : System.Collections.Generic.IEnumerable<string>
{
System.Collections.Generic.IEnumerable<string> data;
public EnumerableTestString(System.Collections.Generic.IEnumerable<string> d)
{
data = d;
}
public System.Collections.Generic.IEnumerator<string> GetEnumerator()
{
foreach (string s in data)
{
yield return s;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
公共类EnumerableTestString:System.Collections.Generic.IEnumerable
{
System.Collections.Generic.IEnumerable数据;
公共EnumerableTestString(System.Collections.Generic.IEnumerable d)
{
数据=d;
}
public System.Collections.Generic.IEnumerator GetEnumerator()
{
foreach(数据中的字符串s)
{
收益率;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
我怎样才能解决这个问题
您需要使用来实现至少一个GetEnumerator
方法,通常是非泛型方法
代码只是通过使用指令:)
使用系统集合;
使用System.Collections.Generic;
公共类EnumerableTestString:IEnumerable
{
私有可数数据;
公共EnumerableTestString(IEnumerable d)
{
数据=d;
}
公共IEnumerator GetEnumerator()
{
foreach(数据中的字符串s)
{
收益率;
}
}
//非泛型IEnumerable的显式接口实现
公共IEnumerator IEnumerable.GetEnumerator()
{
//委托给泛型版本
返回GetEnumerator();
}
}
public class EnumerableTestString : System.Collections.Generic.IEnumerable<string>
{
System.Collections.Generic.IEnumerable<string> data;
public EnumerableTestString(System.Collections.Generic.IEnumerable<string> d)
{
data = d;
}
public System.Collections.Generic.IEnumerator<string> GetEnumerator()
{
foreach (string s in data)
{
yield return s;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
using System.Collections;
using System.Collections.Generic;
public class EnumerableTestString : IEnumerable<string>
{
private IEnumerable<string> data;
public EnumerableTestString(IEnumerable<string> d)
{
data = d;
}
public IEnumerator<string> GetEnumerator()
{
foreach (string s in data)
{
yield return s;
}
}
// Explicit interface implementation for non-generic IEnumerable
public IEnumerator IEnumerable.GetEnumerator()
{
// Delegate to the generic version
return GetEnumerator();
}
}