Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# List GetEnumerator返回类型与接口不匹配_C#_.net_List_Collections_Interface - Fatal编程技术网

C# List 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

在visual studio 2015中,当我转到List.cs并查看类声明时,我只看到一个名为GetEnumerator的方法:

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的显式实现,因为它是私有的?您可以强制转换以查看强类型实现。我将编辑上面的帖子来澄清这一点。谢谢,这很有帮助