C# List GetEnumerator返回类型与接口不匹配
在visual studio 2015中,当我转到List.cs并查看类声明时,我只看到一个名为GetEnumerator的方法:C# List GetEnumerator返回类型与接口不匹配,c#,.net,list,collections,interface,C#,.net,List,Collections,Interface,在visual studio 2015中,当我转到List.cs并查看类声明时,我只看到一个名为GetEnumerator的方法: public Enumerator GetEnumerator(); 另一方面,接口IEnumerable和IEnumerable指定它必须定义格式为: IEnumerator<T> GetEnumerator(); IEnumerator GetEnumerator(); IEnumerator GetEnumerator(); IEnumerat
public Enumerator GetEnumerator();
另一方面,接口IEnumerable和IEnumerable指定它必须定义格式为:
IEnumerator<T> GetEnumerator();
IEnumerator GetEnumerator();
IEnumerator GetEnumerator();
IEnumerator GetEnumerator();
这使我相信,即使reuturn类型不完全匹配,接口方法也可以实现。虽然,当我尝试时,结果证明是错误的
这里发生了什么?接口是显式实现的。您看到的方法不是接口实现,而是类的单独方法。接口是显式实现的。您看到的方法不是接口实现,而是类的一个单独方法。如果查看源代码,您将看到两个不同的GetEnumerator方法:
public Enumerator GetEnumerator() {
return new Enumerator(this);
}
IEnumerator<T> IEnumerable<T>.GetEnumerator() {
return new Enumerator(this);
}
公共枚举器GetEnumerator(){
返回新的枚举数(此);
}
IEnumerator IEnumerable.GetEnumerator(){
返回新的枚举数(此);
}
第二个选项仅在通过IEnumerator接口访问对象时使用。然而,它们都使用相同的底层实现
[Serializable]
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator
{
...
}
[可序列化]
公共结构枚举器:IEnumerator、System.Collections.IEnumerator
{
...
}
您仍然可以访问强类型版本,如下所示:
var exampleList = new List<string>();
var enumerator1 = ((IEnumerable<string>)exampleList).GetEnumerator()
var enumerator2 = (IEnumerable<string>) exampleList.GetEnumerator()
var exampleList=新列表();
变量枚举器1=((IEnumerable)exampleList).GetEnumerator()
变量枚举器2=(IEnumerable)exampleList.GetEnumerator()
对于
enumerator1
您正在强制转换列表,以便对IEnumerable接口使用GetEnumerator()方法。对于enumerator 2
而言,您依赖于在每个中使用相同的实现,因此您可以强制转换枚举器。如果查看源代码,您将看到两种不同的GetEnumerator方法:
public Enumerator GetEnumerator() {
return new Enumerator(this);
}
IEnumerator<T> IEnumerable<T>.GetEnumerator() {
return new Enumerator(this);
}
公共枚举器GetEnumerator(){
返回新的枚举数(此);
}
IEnumerator IEnumerable.GetEnumerator(){
返回新的枚举数(此);
}
第二个选项仅在通过IEnumerator接口访问对象时使用。然而,它们都使用相同的底层实现
[Serializable]
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator
{
...
}
[可序列化]
公共结构枚举器:IEnumerator、System.Collections.IEnumerator
{
...
}
您仍然可以访问强类型版本,如下所示:
var exampleList = new List<string>();
var enumerator1 = ((IEnumerable<string>)exampleList).GetEnumerator()
var enumerator2 = (IEnumerable<string>) exampleList.GetEnumerator()
var exampleList=新列表();
变量枚举器1=((IEnumerable)exampleList).GetEnumerator()
变量枚举器2=(IEnumerable)exampleList.GetEnumerator()
对于
enumerator1
您正在强制转换列表,以便对IEnumerable接口使用GetEnumerator()方法。对于enumerator 2
您依赖于这样一个事实,即在每个中使用相同的实现,因此您可以强制转换枚举器。这是否意味着在元数据视图中该类没有实现,我无法看到GetEnumerator的显式实现,因为它是私有的?您可以强制转换以查看强类型实现。我将对上面的帖子进行编辑以澄清这一点。谢谢,这很有帮助。这是否意味着该类没有实现,在元数据视图中,我无法看到GetEnumerator的显式实现,因为它是私有的?您可以强制转换以查看强类型实现。我将编辑上面的帖子来澄清这一点。谢谢,这很有帮助